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

时间:2014-10-07 10:35:28

标签: linux shell terminal find xargs

是否可以将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)管道|

7 个答案:

答案 0 :(得分:16)

好问题!

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

您可以管道,当然,xargs已针对这些情况完成:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
  
      
  1. 为什么每个人都推荐-exec
  2.   

-exec很好,因为它可以更准确地控制您正在执行的内容。无论何时管道,都可能存在角点问题:包含空格或新行的文件名等等。

  
      
  1. 我怎么知道何时在管道上使用它(exec) ?
  2.   

这取决于你,可能有很多案例。每当要执行的操作很简单时,我都会使用-exec。我不是xargs的好朋友,我倾向于选择将find输出提供给while循环的方法,例如:

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)

答案 1 :(得分:15)

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

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

答案 2 :(得分:6)

您可以使用下面的|

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

回答你的问题:

  • |可用于解决此问题。但如上所述,它涉及大量代码。此外,|将创建两个流程 - 一个用于find,另一个用于cp

  • exec()内使用find将在一个过程中解决问题。

答案 3 :(得分:1)

我喜欢@fedorqui-so-stop-harming 的回应精神,但需要对我的 bash 终端进行调整。

在这个版本中...

find . -iname "*.SomeExt" | xargs cp Destination_Directory/

cp 命令错误地将 Destination_Directory/ 作为第一个参数。我需要添加一个替换字符串,以便让 xargs 将参数插入到 cp 的正确位置。我为替换字符串使用了百分比符号,但您可以使用任何与管道输入不冲突的内容。这个版本适合我。

find . -iname "*.SomeExt" | xargs -I % cp % Destination_Directory/

答案 4 :(得分:0)

试试这个:

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

如果文件名中有空格。

答案 5 :(得分:0)

如果文件名中有空格,请尝试:

find . -iname *.ext > list.txt
cat list.txt | awk 'BEGIN {a="'"'"'"}{print "cp "a$0a" Directory"}' > script.sh
sh script.sh

您可以在list.txt之前检查script.shsh script.sh。请记住,之后要删除list.txtscript.sh

我有一些带括号的文件,并且需要进度条,所以将cat行替换为:

cat list.txt | awk -v X='"' '{print "rsync -Pa "X$0X" /Volumes/Untitled/"}' > script.sh

答案 6 :(得分:0)

这解决了我的问题。

find . -type f | grep '\.pdf' |  while read line 
do
        cp $line REPLACE_WITH_TARGET_DIRECTORY
done