是否可以将FIND的结果传递给COPY命令CP?

问题描述:

是否可以将find的结果传递给COPY命令cp是否可以将FIND的结果传递给COPY命令CP?

像这样:

find . -iname "*.SomeExt" | cp Destination Directory 

求是,我总是觉得这种公式such as from this post的:

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \; 

这就产生了一些问题:

  1. 你为什么不能只是使用|管?这不是它的目的吗?
  2. 为什么大家都推荐-exec
  3. 我怎么知道何时使用那个(exec)管道|
+3

'cp'不接受stdin afaik。 – user2864740 2014-10-07 10:43:25

+0

[Bash:find and copy]的可能重复(http://stackoverflow.com/questions/1562102/bash-find-and-copy)。 – BroSlow 2014-10-07 11:16:31

+0

假设你的'find'具有'-exec ... +',并且你通过pipe/xargs保护你的文件名,那么你使用哪一个真的不重要。如果你的'find'没有'-exec ... +',那么对于任何可以带多个文件名参数的命令,都应该小心使用pipe/xargs。 – BroSlow 2014-10-07 11:25:26

好问题!

  1. 为什么不能使用|管?这不是它的目的吗?

可以通过管道,当然,xargs针对这些情况下完成的:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/ 
  1. 为什么大家推荐-exec
开始=>

-exec是好的,因为它提供了更多的控制你准确的执行。每当你管有可能是极端情况的问题:含有空格的文件名或新的生产线,等等。

  1. 我怎么知道什么时候使用(执行)在管| ?
开始=“3”>

这是真的取决于你,可以有很多情况。只要执行的动作很简单,我就会使用-exec。我不是xargs是很好的朋友,我倾向于选择其中find输出提供给while循环的方法,如:

您可以使用|象下面这样:

find . -iname "*.SomeExt" | while read line 
do 
    cp $line DestDir/ 
done 

回答您的问题:

  • |可以用来解决这个问题。但是如上所见,它涉及很多代码。此外,|将创建两个过程 - 一个为find,另一个为cp

  • 而是使用exec()而不是find将在单个过程中解决问题。

有用于cp一个很少使用的选项:-t destination - 请参见手册页:

find . -iname "*.SomeExt" | xargs cp -t Directory 

试试这个:

find . -iname "*.SomeExt" **-print0** | xargs **-0** cp -t Directory 

但如果是白色的空间的文件名。