如何在bash环境下使用cp、rm命令同时操作多个指定文件夹?
你之前使用的cp -r $(ls -A | grep "Z*") destination命令失效有两个核心原因:
grep "Z*"的匹配规则是0个或多个Z开头的字符串,等价于匹配所有内容,会把当前目录下所有文件/文件夹都纳入操作范围,数据量大时就会卡住无响应- 不要解析
ls的输出做文件操作,遇到文件名/文件夹名带空格、换行、特殊字符时,会被shell错误拆分,直接导致No such file or directory报错
一、批量删除指定文件夹
提示:如果你的系统是非GNU发行版(比如BSD/macOS),find的
-delete参数无法删除非空文件夹,替换为-exec rm -r {} +即可。
- 场景1:删除当前目录下所有以Z开头的文件夹
最稳妥的find原生写法:
参数说明:find . -maxdepth 1 -type d -name "Z*" -delete-maxdepth 1限定只搜索当前目录不递归子目录,-type d只匹配文件夹,-name "Z*"匹配名称以Z开头的对象,-delete直接删除匹配结果。 - 场景2:删除指定目录
/opt/source下的固定名称文件夹(比如要删除dir1、dir2、dir3三个文件夹)find /opt/source -maxdepth 1 -type d \( -name "dir1" -o -name "dir2" -o -name "dir3" \) -delete
二、批量复制指定文件夹
- 场景1:复制当前目录下所有以Z开头的文件夹到
/opt/destination目录
方法1(兼容性最好,支持带特殊字符的文件夹名):
方法2(bash原生写法,路径无特殊字符时更简洁):find . -maxdepth 1 -type d -name "Z*" -exec cp -r {} /opt/destination \;
先执行shopt -s extglob(可写入~/.bashrc永久生效),再运行:
参数说明:cp -r Z*/ /opt/destinationZ*/末尾的斜杠强制只匹配以Z开头的文件夹,不会匹配普通文件。 - 场景2:复制指定目录
/opt/source下的多个固定名称文件夹(比如dir1、dir2、dir3)到目标目录
大括号扩展写法适合已知要操作的文件夹名称的场景,无需调用额外命令。cp -r /opt/source/{dir1,dir2,dir3} /opt/destination
管道传参的正确写法
cp、rm默认不读取管道输入的参数,需要搭配xargs的-0参数配合find的-print0使用,完全规避特殊字符导致的路径拆分错误,以删除场景为例:
find . -maxdepth 1 -type d -name "Z*" -print0 | xargs -0 rm -r
内容的提问来源于stack exchange,提问作者Argento
相关产品推荐
相关产品推荐

