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

Pau*_*aul 19 linux shell terminal find xargs

是否可以将结果find传递给COPY命令cp

像这样:

find . -iname "*.SomeExt" | cp Destination Directory
Run Code Online (Sandbox Code Playgroud)

寻求,我总是找到这样的公式,如从这篇文章:

find . -name "*.pdf" -type f -exec cp {} ./pdfsfolder \;
Run Code Online (Sandbox Code Playgroud)

这提出了一些问题:

  1. 为什么你不能使用|烟斗?这不是它的用途吗?
  2. 为什么每个人都推荐 -exec
  3. 我怎么知道何时使用(exec)管道|

fed*_*qui 19

好问题!

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

当然,你可以xargs为这些情况做管道:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
Run Code Online (Sandbox Code Playgroud)
  1. 为什么每个人都推荐-exec

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

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

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

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,需要将 -t 标志添加到 cp 命令才能工作 (3认同)

gle*_*man 18

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

find . -iname "*.SomeExt" | xargs cp -t Directory
Run Code Online (Sandbox Code Playgroud)


Faz*_*lin 8

你可以使用|如下:

find . -iname "*.SomeExt" | while read line
do
  cp $line DestDir/
done
Run Code Online (Sandbox Code Playgroud)

回答你的问题:

  • |可以用来解决这个问题.但如上所述,它涉及大量代码.而且,|将创建两个过程 - 一个用于find另一个用于cp.

  • 而使用exec()内部find将在单个过程中解决问题.


小智 6

尝试这个:

find . -iname "*.SomeExt" -print0  | xargs -0 cp -t Directory
# ........................^^^^^^^..........^^
Run Code Online (Sandbox Code Playgroud)

如果文件名中有空格。