Linux下使用find命令批量复制多条件匹配文件的方法
解决find多条件(-o)搭配-exec批量复制失效的问题
问题原因
find命令中,-o(逻辑或)的优先级低于-exec这类动作选项。你原命令的执行逻辑相当于:( -name "ACMB*" ) -o ( -name "AAVD *" ) -o ... -o ( -name "AABS*" -exec cp ... )
只有最后一个-name "AABS*"的匹配结果会触发cp操作,其他条件匹配的文件不会执行复制,这就是目标目录仅出现AABS开头文件的原因。
正确解决方案
把所有匹配条件用括号包裹(提升优先级),确保所有符合条件的文件都会触发-exec动作。注意括号在shell环境中需要转义,或者用单引号包裹:
转义括号写法
$ find \( -name "ACMB*" -o -name "AAVD*" -o -name "SOCK*" -o -name "SMNK*" -o -name "APRN*" -o -name "WAPP*" -o -name "AABS*" -o -name "ATRN*" \) -exec cp "{}" ./forShaq1/ \;
单引号包裹括号写法(部分shell适用)
$ find '(' -name "ACMB*" -o -name "AAVD*" -o -name "SOCK*" -o -name "SMNK*" -o -name "APRN*" -o -name "WAPP*" -o -name "AABS*" -o -name "ATRN*" ')' -exec cp "{}" ./forShaq1/ \;
效率优化(可选)
如果需要复制的文件数量较多,用+代替;作为-exec的结束符,这样find会一次性将多个匹配文件传给cp命令,减少进程创建开销:
$ find \( -name "ACMB*" -o -name "AAVD*" -o -name "SOCK*" -o -name "SMNK*" -o -name "APRN*" -o -name "WAPP*" -o -name "AABS*" -o -name "ATRN*" \) -exec cp "{}" ./forShaq1/ +
内容的提问来源于stack exchange,提问作者HattrickNZ
相关产品推荐
相关产品推荐

