Bash Shell 递归实现目录中文件拷贝

前言

今天工作中遇到了一个问题,如果将目录A中的文件拷贝到目录B中(前提目录B没有该文件),并保持文件在目录A的结构。项目重点如下:

  1. 需要在目录B中保持文件在目录A中的结构。假设A目录文件 A/test/1.txt,转移到目录B中应该是B/test/1.txt。同时还需要考虑目录B中是否存在test目录,多级目录就要考虑递归了。(还好,bash shell里写个目录递归遍历还是比较简单的。)
  2. 需要考虑A中文件是否在B中已经存在同名文件,如果存在,则不需要拷贝。

项目需求示例图如下:

实现

项目需求有了,知道设计到递归,代码就很好写了。这里给出一个demo示例,供大家参考。

#!/bin/bash

function recursive_copy_file()
{
    dirlist=$(ls $1)
    for name in ${dirlist[*]}
    do
        if [ -f $1/$name ]; then
            # 如果是文件,并且$2不存在该文件,则直接copy
            if [ ! -f $2/$name ]; then
                cp $1/$name $2/$name
            fi
        elif [ -d $1/$name ]; then
            # 如果是目录,并且$2不存在该目录,则先创建目录
            if [ ! -d $2/$name ]; then
                mkdir -p $2/$name
            fi
            # 递归拷贝
            recursive_copy_file $1/$name $2/$name
        fi
    done
}

source_dir="/tmp/test/system"
dest_dir="/tmp/test/systemback"

recursive_copy_file $source_dir $dest_dir
时间: 2024-11-08 19:39:57

Bash Shell 递归实现目录中文件拷贝的相关文章

Python递归列出目录中文件脚本及其匿名函数

1.递归列出目录里的文件的脚本举例 列出目录中的文件可以通过下面方法:os.listdir() In [1]: import os In [4]: os.listdir('/root') Out[4]: ['.tcshrc', '.bash_history', '.bashrc', 'ENV', '.cache', '.config', '.cshrc', '.bash_logout', 'python', '.ssh', 'shell', '.bash_profile', '.ipython'

C#统计目录中文件MD5值

1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using System.Windows.Forms; IDataObject iData = Clipboard.GetDataObject();   if (iData.GetDataPresent(DataFormats.Text))   {string filepath=(string)iData.G

使用IO流实现对特殊文件及文件夹中文件拷贝到指定文件中

本程序可以实现将自己指定的文件类型的文件拷贝到自己想放的文件中,比如一个文件夹中有很多文件,那么我们想把所有的TXT文件拷贝到自己指定的文件中.(靠背笔记) package com.blueZhang; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept

shell命令从目录中循环匹配关键词

#!/bin/bash while read line do for file in /home/local/test/* do if test -f $file then sed -n "/${line}/p" $file >> /home/local/out.txt fi done done < macid.txt 任务:要从home/local/test 文件夹下面的文件 file_1.log file_2.log .... 文件中把包含macid.txt文件的

shell命令-将源目录下文件拷贝到目标目录

#!/bin/bash function read_dir(){ for file in `ls $1` #``这是两个反引号,表示运行系统命令 do if [ -d $1"/"$file ] #注意此处之间一定要加上空格,否则会报错 then read_dir $1"/"$file $2 else str=$1 room=${str##*/} str=${str%/*} date=${str##*/} dst=$2"/"$date"/

程序1-1 列出目录中文件

#include "apue.h" #include <dirent.h> int main(int argc, char* argv[]) { DIR* dp; struct dirent* dirp; if (argc != 2) err_quit("usage: ls directory_name"); if ((dp = opendir(argv[1])) == NULL) { err_sys("can't open %s",

bash shell,调用ffmpeg定期截图

#!/bin/bash #获取当前目录中所有m3u8文件,并 var=$(ls |grep '.m3u8'|cut -d '.' -f1) #死循环 while [ 1 = 1 ] do #循环每个文件 for stream in $var do #获取当前最新视频文件 ts=$(ls -t|grep "$stream") for file in $ts do #存储M3U8文件文件名作为图片文件名,截图为220*120,截取第一帧,存储在当前目录的screen文件夹 img=$(ls

linux中文件/目录普通权限

权限 文件属性的查看############# ls -l filename/ls -ld dictionary-|rw-r--r--.|1| root| root|   46 |Oct  1 05:03 |filename- ---------  -  ----  ----    --  ------------  -------- 1    2         3    4      5      6      7             81."-":文件类型 -    ##普通

linux复制指定目录下的全部文件到另一个目录中

linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir2.怎样才能将dir1下所有文件复制到dir2下了如果dir2目录不存在,则可以直接使用cp -r dir1 dir2即可.如果dir2目录已存在,则需要使用cp -r dir1/. dir2如果这时使用cp -r dir1 dir2,则也会将dir1目录复制到dir2中,明显不符合要求.ps:di