如何使用bash查找所有可执行文件并连同目录复制到指定测试文件夹
问题根因
之前的find命令出现.txt被误复制的问题,基本都是匹配条件写错导致的:要么是权限判断规则错误,把带读权限的普通文本纳入了匹配范围;要么是漏加文件类型过滤,匹配到目录后连带目录下的非可执行文件一起复制。
可直接复用的正确实现
优先用find + cpio的组合,对特殊文件名兼容性最好、复制效率最高,执行前先确保当前目录下没有重名的dummy文件夹,或者提前清空dummy目录避免旧文件干扰:
# 将<源目录1> <源目录2>替换成你要扫描的多个实际目录路径即可 find <源目录1> <源目录2> -type f -executable -print0 | cpio -pdm0 ./dummy/
参数说明:
-type f:仅匹配普通文件,排除目录、软链接、套接字等特殊文件类型-executable:仅匹配当前运行命令的用户具备执行权限的文件,无执行权限的.txt、.md等普通文本文件会被直接过滤-print0配合cpio的-0参数:用null字符分隔文件名,完美兼容带空格、换行、特殊字符的文件名,避免复制出错- cpio参数:
-p为透传复制模式,-d自动按需创建父目录保留原有结构,-m保留原文件的修改时间属性
如果是在macOS等默认不带GNU版本find的系统上,-executable参数不生效,可以替换为权限位匹配规则:
find <源目录1> <源目录2> -type f -perm +111 -print0 | cpio -pdm0 ./dummy/
其中-perm +111表示匹配属主、属组、其他用户任意一方拥有执行权限的文件,效果和GNU find的-executable基本一致。
如果习惯用cp命令保留目录结构的写法也可以,只是文件量较大时因为要反复调用cp进程,复制速度会慢一些:
find <源目录1> <源目录2> -type f -executable -exec cp --parents {} ./dummy/ \;
常见错误写法避坑
不要用类似下面的错误写法,这类写法就是导致.txt被误复制的核心原因:
错误示例:
find . -type f -perm /u+r -exec cp --parents {} ./dummy/ \;
该规则匹配的是所有用户可读的文件,系统中绝大多数.txt默认都带读权限,自然会被全部复制。还有部分写法漏加-type f参数,会把目录本身匹配到结果中,触发cp命令复制整个目录下的所有内容,完全绕过可执行文件的过滤规则。
内容的提问来源于stack exchange,提问作者user3335796
相关产品推荐
相关产品推荐

