find -name "sw*pll*"|xargs cp dump.lst有几个问题,不能正确实现“将dump.lst复制到所有匹配sw*pll*的目录中”。
问题分析
find缺少搜索路径find的基本语法是find [路径] [表达式],直接写find -name ...在 GNU find 中会报错(paths must precede expression)。应指定路径,如.表示当前目录。未限定只匹配目录
-name "sw*pll*"会同时匹配文件和目录。如果匹配到文件,cp dump.lst 文件会覆盖该文件,而不是复制到目录中。应加上-type d确保只匹配目录。xargs cp dump.lst参数传递错误xargs会把找到的所有路径一次性附加到cp dump.lst后面,变成类似:cp dump.lst dir1 dir2 dir3
但
cp只允许一个源文件和一个目标(或多个源文件和一个目标目录)。这里只有一个源dump.lst,却有多个目标,cp会报错(target 'dir2' is not a directory等)。必须对每个目录单独执行一次cp。未处理文件名中的空格等特殊字符
如果目录名包含空格,xargs默认按空白分割会导致错误。应使用-print0和xargs -0,或直接用find -exec。
正确写法
使用find的-exec选项,对每个匹配的目录单独执行一次复制:
find . -type d -name "sw*pll*" -exec cp dump.lst {} \;.:从当前目录开始搜索。-type d:只查找目录。-name "sw*pll*":名称匹配模式。-exec cp dump.lst {} \;:对每个找到的目录{}执行cp dump.lst <目录>,\;表示命令结束。
其他可选方案
如果目录名可能包含空格,上述-exec方式已经能安全处理。若想用xargs,可以这样:
find . -type d -name "sw*pll*" -print0 | xargs -0 -I {} cp dump.lst {}或者使用cp -t(但需要循环,不如-exec简洁)。
注意事项
如果目标目录中已存在
dump.lst,会被直接覆盖。若想避免覆盖,可加-i(交互)或-n(不覆盖)选项,例如cp -n dump.lst {}。确保
dump.lst文件存在且路径正确。
总结:原命令不正确,推荐使用:
find . -type d -name "sw*pll*" -exec cp dump.lst {} \;