可以使用管道代替 exec in -find / -name “.txt” -exec cp {} /junk \;

可以使用管道代替 exec in -find / -name “.txt” -exec cp {} /junk \;

如果我想查找名称中包含 .txt 的任何文件,并将找到的每个匹配项将其复制到/junk文件夹中,我知道我可以使用以下命令:

find / -name ".txt" -exec cp {} /junk \;

可以使用管道代替-exec上面的命令吗?

我想我记得有人说过管道将同时运行(管道的每一侧),而管道-exec将先运行左侧,然后运行右侧?我是否怀念这个?管道显然需要先从左侧命令获取输出,然后才能将输出提供给右侧命令,因此我不知道它们如何同时运行。

答案1

cpio为此,您可以在复制传递模式下使用。

find sourcedir -name "*.txt" | cpio -pd /junk

cpio从标准输入获取文件列表,并在复制传递模式下将文件复制到目标目录中。

答案2

您还可以通过管道 find 到 xargs 命令

裸露的片段来自-http://www.unixmantra.com/2013/12/xargs-all-in-one-tutorial-guide.html

找到music文件夹中的所有.mp3文件并传递给ls命令,如果任何文件名包含空格,则需要-print0:

   find ./music -name "*.mp3" -print0 | xargs -0 ls

查找工作文件夹中的所有文件,传递给 grep 并搜索利润:

   find ./work -print | xargs grep "profit"

您需要将 {} 与同时接受两个以上参数的各种命令一起使用。例如mv命令需要知道文件名。以下命令将查找当前目录中或当前目录下的所有 .bak 文件并将它们移至 ~/.old.files 目录:

find . -name "*.sh" -print0 | xargs -0 -I {} mv {} ~/back.scripts

您可以将 {} 重命名为其他名称。在以下示例中,{} 被重命名为 file。与前面的示例相比,这更具可读性:

find . -name "*.sh" -print0 | xargs -0 -I file mv file ~/back.scripts

在哪里,

-0 如果有空格或字符(包括换行符),许多命令将不起作用。此选项负责处理带有空格的文件名。

-I 将初始参数中出现的replace-str 替换为从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。

相关内容