如果我想查找名称中包含 .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 替换为从标准输入读取的名称。此外,不带引号的空格不会终止输入项;相反,分隔符是换行符。