Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是否可以将FIND的结果通过管道传输到COPY命令CP?_Linux_Shell_Terminal_Find_Xargs - Fatal编程技术网

Linux 是否可以将FIND的结果通过管道传输到COPY命令CP?

Linux 是否可以将FIND的结果通过管道传输到COPY命令CP?,linux,shell,terminal,find,xargs,Linux,Shell,Terminal,Find,Xargs,是否可以将find的结果通过管道传输到COPY命令cp 像这样: find . -iname "*.SomeExt" | cp Destination Directory 寻找,我总是发现这样的公式: 这引起了一些问题: 你为什么不能直接使用管道呢?这不是它的目的吗 为什么每个人都推荐-exec 我如何知道何时通过管道使用(exec)| 您可以像下面这样使用|: find . -iname "*.SomeExt" | while read line do cp $line DestDir/

是否可以将
find
的结果通过管道传输到COPY命令
cp

像这样:

find . -iname "*.SomeExt" | cp Destination Directory
寻找,我总是发现这样的公式:

这引起了一些问题:

  • 你为什么不能直接使用管道呢?这不是它的目的吗
  • 为什么每个人都推荐
    -exec
  • 我如何知道何时通过管道使用(exec)
    |

  • 您可以像下面这样使用
    |

    find . -iname "*.SomeExt" | while read line
    do
      cp $line DestDir/
    done
    
    回答您的问题:

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

    • 相反,在
      find
      内部使用
      exec()
      将在单个进程中解决问题

      • 问得好

      • 你为什么不能用烟斗呢?这不是它的目的吗
      • 当然,您可以对这些情况使用管道,
        xargs

        find . -iname "*.SomeExt" | xargs cp Destination_Directory/
        
      • 为什么每个人都推荐-exec
      • -exec
        很好,因为它提供了对执行内容的更多控制。无论何时使用管道,角落案例可能会出现问题:包含空格或新行的文件名,等等

      • 我如何知道何时在管道上使用(exec)
      • 这真的取决于你,可能有很多情况。只要要执行的操作很简单,我就会使用
        -exec
        。我不是
        xargs
        的好朋友,我倾向于选择将
        find
        输出提供给
        while
        循环的方法,例如:

        while IFS= read -r result
        do
            # do things with "$result"
        done < <(find ...)
        
        而IFS=读取-r结果
        做
        #使用“$result”进行操作
        
        完成<对于
        cp
        -t destination
        ——请参见手册页:

        find . -iname "*.SomeExt" | xargs cp -t Directory
        
        试试这个:

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

        如果文件名中有空格。

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

        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.txt
        script.sh
        。记得在之后删除
        list.txt
        script.sh

        我有一些带括号的文件,需要一个进度条,因此将
        cat
        行替换为:


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

        这解决了我的问题

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

        我喜欢@fedorqui的响应精神,所以不要再伤害我了,但它需要在我的bash终端中进行调整

        在这个版本中

        find . -iname "*.SomeExt" | xargs cp Destination_Directory/
        
        cp
        命令错误地将
        Destination\u Directory/
        作为第一个参数。我需要添加一个替换字符串,以便获得
        xargs
        以将参数插入到
        cp
        的正确位置。我为替换字符串使用了百分比符号,但您可以使用与来自管道的输入。这个版本适合我

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

        cp
        不接受stdin afaik。可能的重复。假设您的
        find
        -exec…++
        并且您通过管道/xargs保护您的文件名,那么您使用哪一个并不重要。如果您的
        find
        没有
        -exec…++/code>,那么任何co都应该首选谨慎的管道/xargs可以接受多个文件名参数的mmand。这对我不起作用,需要将-t标志添加到cp命令才能起作用
        
        find . -iname "*.SomeExt" | xargs -I % cp % Destination_Directory/