将递归搜索的匹配项复制到新位置

将递归搜索的匹配项复制到新位置

我想递归搜索目录并将所有 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+findcp

编辑:如果你cp没有这个-t选项,请使用这个:

find . -name "*.xml" -exec cp -v {} /newdir/ \;

相关内容