【问题标题】:Is it possible to pipe the results of FIND to a COPY command CP?是否可以将 FIND 的结果通过管道传输到 COPY 命令 CP?
【发布时间】:2014-12-01 18:20:17
【问题描述】:

是否可以将find 的结果通过管道传送到复制命令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)?

【问题讨论】:

  • cp 不接受标准输入 afaik。
  • Bash: find and copy 的可能副本。
  • 假设您的find 具有-exec ... + 并且您通过管道/xargs 保护您的文件名,那么您使用哪个并不重要。如果您的find 没有-exec ... +,那么对于任何可以采用多个文件名参数的命令,都应该始终首选谨慎的管道/xargs。

标签: linux shell terminal find xargs


【解决方案1】:

您可以使用|,如下所示:

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

回答您的问题:

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

  • find 中使用exec() 将在单个进程中解决问题。

【讨论】:

    【解决方案2】:

    好问题!

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

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

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

    -exec 很好,因为它可以更好地控制您正在执行的操作。每当您使用管道时,可能会出现极端情况的问题:包含空格或换行符的文件名等。

    1. 我如何知道何时通过管道使用 (exec) | ?

    这完全取决于您,可能有很多情况。只要执行的操作很简单,我就会使用-exec。我不是xargs 的好朋友,我倾向于将find 输出提供给while 循环的方法,例如:

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

    【讨论】:

    • 这对我不起作用,需要将 -t 标志添加到 cp 命令才能工作
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

      如果文件名中有空格。

      【讨论】:

        【解决方案5】:

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

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

        您可以在sh script.sh 之前检查list.txtscript.sh。之后记得删除list.txtscript.sh

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

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

        【讨论】:

          【解决方案6】:

          这解决了我的问题。

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

          【讨论】:

            【解决方案7】:

            我喜欢 @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/
            

            【讨论】:

              猜你喜欢
              • 2016-10-27
              • 1970-01-01
              • 1970-01-01
              • 2018-08-18
              • 2014-08-17
              • 1970-01-01
              • 2017-10-12
              • 2014-04-18
              • 1970-01-01
              相关资源
              最近更新 更多