![将递归搜索的匹配项复制到新位置](https://linux22.com/image/1463844/%E5%B0%86%E9%80%92%E5%BD%92%E6%90%9C%E7%B4%A2%E7%9A%84%E5%8C%B9%E9%85%8D%E9%A1%B9%E5%A4%8D%E5%88%B6%E5%88%B0%E6%96%B0%E4%BD%8D%E7%BD%AE.png)
我想递归搜索目录并将所有 XML 文件复制到新位置。我可以使用以下方法识别文件:
ls -R | grep .xml$
或者使用完整路径:
find . -name \*.xml
正常调用的结果ls
可以像这样传递cp
:
cp `ls` ./newdir
但我似乎无法让这种方法适用于递归搜索——cp
误读了生成的 grep 字符串并创建了大量空文件。最接近的SU 问题– 使用locate
– 无法移动任何文件。
编辑:
替代方法:
find . -name \*.xml > xml_list.txt
while read p; do cp $p ./newdir; done <xml_list.txt
.. 生成错误列表(长度超过行数),格式如下:
cp: pathfilenamesegment: No such file or directory
.. 其中pathfilenamesegment
是恰好由空格分隔的文件/路径字符串的片段。 Bash 显然不是将字符串作为整体应用,而是分段应用。 但是迭代器工作正常,因为替换echo 1
打印的次数与 中的行数相同xml_list.txt
。
有什么方法可以强制 bash 将行识别为整个字符串?
答案1
使用find
:
find . -name "*.xml" -exec cp -vt /newdir {} +
这将搜索所有以 结尾的文件.xml
。然后对它们find
执行操作。使用字符运行命令,尽可能少地调用,并将 shell 允许的尽可能多的参数串在一起。cp -vt /newdir
+
find
cp
编辑:如果你cp
没有这个-t
选项,请使用这个:
find . -name "*.xml" -exec cp -v {} /newdir/ \;