使用cp命令复制目录时如何排除所有名为outdir的文件夹(无rsync权限)
复制目录并排除所有层级outdir文件夹的实现方案
适用场景
集群环境禁用rsync,仅可使用cp、find等基础系统命令的场景
可直接使用的命令
如果你不需要保留原目录结构中的空目录,直接执行以下命令即可:
find . -type d -name "outdir" -prune -o -type f -exec cp --parents -v {} ../target-directory/ \;
如果你需要保留所有非outdir的空目录,先执行目录创建命令,再执行文件复制命令:
# 第一步:在目标目录下创建所有非outdir的目录结构 find . -type d -name "outdir" -prune -o -type d -exec mkdir -p ../target-directory/{} \; # 第二步:复制所有非outdir目录下的文件 find . -type d -name "outdir" -prune -o -type f -exec cp --parents -v {} ../target-directory/ \;
参数详细解释
find命令部分参数
find .:从当前执行命令的目录开始,递归遍历所有子内容-type d -name "outdir" -prune:匹配所有名称为outdir的目录,-prune参数作用是裁剪搜索路径,找到outdir目录后直接跳过该目录及其所有下级内容,不再进入搜索,完美实现全层级排除outdir的需求-o:逻辑或运算符,代表只有不满足前面排除条件的内容,才会执行后面的操作-type f:筛选出排除outdir后剩下的普通文件,如果需要保留软链接等其他类型的文件,可删除该参数-exec 命令 \;:对每一个筛选出来的对象执行指定命令,结尾的\;是-exec参数的固定结束标记,反斜杠为转义符,避免被bash提前解析{}:find命令的占位符,执行时会自动替换为每个筛选到的文件/目录的相对路径
cp命令部分参数
--parents:自动保留源文件的相对目录结构,例如筛选到的文件路径为./demo/sub1/file.txt,复制时会自动在目标目录下创建demo/sub1/层级,再将文件放入对应路径,完全保留原有目录结构-v:打印复制过程的详细日志,不需要可删除-p(可选):如果需要保留文件的权限、修改时间等元数据,可以在cp参数中加上-p即可
原有命令失效原因说明
cp -r -v ./!(outdir) ../target-directory/使用的是bash的扩展通配符语法,该通配符仅匹配当前目录层级的内容,不会递归处理子目录内的对象,因此只能排除顶层的outdir,子目录中的outdir不会被匹配到,会被正常复制cp -r ./*/!(outdir) ../target-directory/匹配的是一级子目录下的非outdir对象,cp会直接将这些对象复制到目标目录的根路径下,因此会丢失原有的多层级结构
内容的提问来源于stack exchange,提问作者DeltaChief
相关产品推荐
相关产品推荐

