使用Bash Shell对目录中的文件实现递归式拷贝_linux shell

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

    需要在目录B中保持文件在目录A中的结构。假设A目录文件 A/test/1.txt,转移到目录B中应该是B/test/1.txt。同时还需要考虑目录B中是否存在test目录,多级目录就要考虑递归了。(还好,bash shell里写个目录递归遍历还是比较简单的。)
    需要考虑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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索shell
, 拷贝
bash
shell 递归遍历目录、shell 递归创建目录、shell 拷贝目录、bash 递归遍历文件夹、scp 递归拷贝,以便于您获取更多的相关知识。

时间: 2024-11-06 07:13:46

使用Bash Shell对目录中的文件实现递归式拷贝_linux shell的相关文章

在shell或者perl中改变字体或背景的颜色_linux shell

在shell下提到终端的颜色的时候不得不提到几个提示符变量: PS1:默认提示符,也就是远程登上系统之后,打开终端,我们天天见到的那个熟悉的提示符: [root@vps ~]$echo $PS1[\u@\h \W]$ PS2:就是我们命令一行写不完在我们命令行下我们打上"\",另起一行所显示的那个: [root@vps ~]$echo "hello" \> "world"hello world[root@vps ~]$echo $PS1[\

ubuntu下lamp在www目录中php文件打开无法加载外部样式css

问题描述 ubuntu下lamp在www目录中php文件打开无法加载外部样式css ubuntu14.04,apache2 .php5在www目录下尝试着建立了一个网站有一个php文件,里面 的html部分引入了外部css但是在浏览器打开时没有css样式 php代码,新手如果写错了犯了低级错误望指正 界面没有样式 还有目录结构 解决方案 客户端用chrome的开发者工具调试下,在network分析面板上看你客户端请求css的时候服务器返回什么.是不是相对路径错误,或者没有正确返回. 解决方案二:

在 android 目录中过滤文件

问题描述 在 android 目录中过滤文件 我从图像库文件夹中获取图像,并把它保存在一个数组列表中.现在我只想提取有.jpg扩展的文件.如何实现呢? private List<String> ReadSDCard() { //It have to be matched with the directory in SDCard File f = new File("sdcard/data/crak"); File[] files=f.listFiles(); for(int

java-tomcat虚拟目录中的文件,怎么下载?

问题描述 tomcat虚拟目录中的文件,怎么下载? 点击文件列表中的文件,浏览器直接打开文件了,怎么让浏览器不直接打开,提示保存文件? 解决方案 只要把文件后缀名改成不是浏览器能解析的文件类型就好了,直接下载 解决方案二: 把文件放在不能直接访问的目录下面,比如WEB-INF目录下,然后通过访问控制器以流的形式写给浏览器,在写给浏览器的header中控制下载 解决方案三: 这跟浏览器也有关系,也跟文件类型有关系,有的文件需要在SERVER.XML里配置才能下载 解决方案四: 这里有篇文章,能够解

Linux基础命令:显示其他目录中的文件

上面都是显示当前工作目录中的文件,如果要显示其他目录中的文件,那么我们只要在"ls"后面加入所要显示的目录的路径.如下所示: [root@Linux ~]# ls /bin dev home lost+found misc net proc sbin srv tftpboot usrboot etc lib media mnt opt root selinux sys tmp var 这样显示的就是"/"目录下的文件.当然我们也可以加入一下参数,如下所示: [roo

一天一个shell命令 linux好管家-磁盘-du命令详解_linux shell

du命令 磁盘管理 du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个别文件的大小. -b或-bytes 显示目录或文件大小时,以byte为单位. -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和. -k或--kilobytes 以KB(1024bytes)为单位输出. -m或--megabytes 以MB为单位

Shell中删除某些文件外所有文件的3个方法_linux shell

我的一位同事曾经问过我这样一个问题:在 Linux 下,如何 删除目录中除某些文件之外的所有文件?当时,我告诉他可 以通过模式匹配的方法解决.但其实,除此之外,还有其他 的方法,正所谓"条条大路通罗马".让我们来逐一看看. 假设要删除 ~/Downloads 目录中除 *.iso 和 *.zip 外的 所有文件,那么在 bash 中可以按以下方法处理: 方法1:模式匹配法 复制代码 代码如下: shopt -s extglob # 确认开启 extglob 选项 cd ~/Downlo

PowerShell移动目录中指定文件的方法(非全部文件)_PowerShell

小编在做一个小功能的时候,遇到一个功能,就是把一个目录中的指定条件的文件,移动到另外一个目录.这是需求,然后我们来分析下该怎么实现. 首先获取一个目录下子项目,第一时间可以想到Get-ChildItem,但我们之前用得太多了,这次小编想换个花样,我们就用Get-Item,然后用通配符来包括所有的子项目.当然,如果你需要指定的文件是以文件名来匹配的,那可以直接在这里使用匹配规则. 然后从选出来的子项目中,筛选中文件来.这个也是一个非常常用的功能,那就是判断PSIsContainer属性是否为$fa

shell中的各种括号的使用方法_linux shell

在这里我想说的是几种shell里的小括号,大括号结构和有括号的变量,命令的用法,如下: 1.${var} 2.$(cmd) 3.()和{} 4.${var:-string},${var:+string},${var:=string},${var:?string} 5.$((exp)) 6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern) 现在分述如下: 1.Shell中变量的原形:${var}大家常见的变量形式都是$var