使用Bash 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逐行读取文件的4种方法
在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. 方法1:while循环中执行效率最高,最常用的方法. 复制代码 代码如下: function while_read_LINE_bottm(){ While read LINE do echo $LINE done < $FILENAME } 注释:我习惯把这种方式叫做read釜底抽薪,因为这种方
-
shell去掉文件中空行(空白行)的方法详解
本文详细介绍了使用shell去除文件中的空行的方法,学习下sed.awk.shell文件检测的方法,有需要的朋友可以作个参考. 本节内容:shell去掉文件中空行 1,shell 去掉文件中的空行 复制代码 代码如下: cat filename | sed -e '/^$/d' > filename 2,保留最新的9个文件,其它的文件删除的命令语句 复制代码 代码如下: ls -t | awk '{if(NR>9){print $0}}' |xargs rm -f 附,shell中的特殊变量
-
shell脚本中执行时提示“没有那个文件或目录”的解决办法
出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不Set一下又完全看不出来. 问题分析:1.将windows 下编写好的SHELL文件,传到linux下执行,提示出错.2.出错信息:bad interpreter: 没有那个文件或目录. 问题原因:因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符.脚本文件是DOS格式
-
判断文件是否存在的shell脚本代码
实现代码一. #!/bin/sh # 判断文件是否存在 # link:www.jb51.net # date:2013/2/28 myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPath" fi # 这里的-d
-
Shell脚本统计文件行数的8种方法
获取单个文件行数 文件:test1.sh 行数:20 方法一 复制代码 代码如下: awk '{print NR}' test1.sh|tail -n1 如图所示: 方法二 复制代码 代码如下: awk 'END{print NR}' test1.sh 如图所示: 方法三 复制代码 代码如下: grep -n "" test1.sh|awk -F: '{print '}|tail -n1 如图所示: 方法四 复制代码 代码如下: sed -n '$=' test1.sh 如图所示: 方
-
使用Bash Shell获取文件名和目录名的简单方法
前言 还是今天再写一个自动化打包脚本,用到了从路径名中获取最后的文件名.这里记录一下实现过程.当然,最后我也会给出官方的做法.(ps:很囧,实现完了才发现原来Bash Shell有现成的函数) 获取文件名 假设给定的路径名为: /tmp/csdn/zhengyi/test/zhengyi.txt awk解法 用"/"做分隔符,然后打印出最后的那一部分.实现代码如下: resFile=`echo /tmp/csdn/zhengyi/test/adb.log | awk -F "
-
shell按行读取文件的3种方法
方法有很多,下面写出三种方法:写法一: 复制代码 代码如下: #!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件) 写法二: 复制代码 代码如下: #!/bin/bashcat filename(待读取的文件) | while read linedoecho $linedone 写法三: 复制代码 代码如下: for line in `cat filename(待读取的文件)`doecho $linedone 说明:for逐行
-
使用bash shell删除目录中的特定文件的3种方法
我是一名Linux新用户.现在我需要清理一个下载目录中的文件,其实我就是想从-/Download/文件夹删去除了以下格式的文件外所以其它文件: 1.*.iso - 所有的iso格式的文件. 2.*.zip - 所有zip格式的文件. 我如何在一个基于Linux,OS X 或者 Unix-like 系统上的bash shell中删除特定的文件呢? Bash shell 支持丰富的文件模式匹配符例如: 1.* - 匹配所有的文件. 2.? - 匹配文件名中的单个字母. 3.[...] - 匹配封闭括
-
Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录
有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你的脚本文件在windows下编辑过.windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat -A urfile时你可以看到这个\r字符被显示为^M,这时候只需要删除这个字符就可以了.可以使用命令sed -i 's/\r$//' urfile .有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你
-
使用Bash Shell检查文件是否存在的方法
前言 大家在工作的时候可能经常会遇到这样的需求,在类Unix系统的Bash环境下,怎样检查文件是否存在呢?既然有需求,当然就有解决的办法了,Shell中的test命令,可以用来检测文件的类型或者比较数值是否相等,该命令也能用来检查文件是否存在. 可以用如下的命令来进行检查: test -e filename [ -e filename ] test -f filename [ -f filename ] 下面的命令,则使用Shell的条件表达式,判断/etc/hosts文件是否存在: [ -f
随机推荐
- yui3的AOP(面向切面编程)和OOP(面向对象编程)
- IOS 关键字const 、static、extern详解
- Java实现AES加密算法的简单示例分享
- Python中用Ctrl+C终止多线程程序的问题解决
- 使用Python神器对付12306变态验证码
- 使用InstantClick.js让页面提前加载200ms
- .Net创建Excel文件(插入数据、修改格式、生成图表)的方法
- PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
- Python 操作MySQL详解及实例
- 系统时间改为2000年 修改系统时间病毒
- MYSQL主从数据库同步备份配置的方法
- android ViewPager实现自动无限轮播和下方向导圆点
- vue2.0在table中实现全选和反选的示例代码
- js replace()去除代码中空格的实例
- PHP获取网卡地址的代码
- 让div运动起来 js实现缓动效果
- Nginx启动常见错误及解决方法
- Android DrawerLayout实现抽屉效果实例代码
- Kotlin语法学习-变量定义、函数扩展、Parcelable序列化等简单总结
- VC下实现fopen支持中文的方法
