Find

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

  • January 31, 2017

如果我想查找名稱中帶有 .txt 的任何文件,並將找到的每個匹配項複製到/junk文件夾中,我知道我可以使用以下內容:

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

可以使用管道代替-exec上述命令嗎?

我想我記得有人說管道會同時執行(管道的)每一側,-exec而左側然後是右側?我想念這個嗎?Pipe 顯然需要先從左側命令獲取輸出,然後再將輸出提供給右側命令,所以我看不出它們如何同時執行。

為此,您可以cpio在複製傳遞模式下使用。

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

cpio從標準輸入中獲取文件列表,並在複製傳遞模式下將文件複製到目標目錄。

您還可以通過管道將 find 傳遞給 xargs 命令

來自 - http://www.unixmantra.com/2013/12/xargs-all-in-one-tutorial-guide.html的簡單片段

查找音樂文件夾中的所有 .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

您可以將 {} 重命名為其他名稱。在以下範例中,{} 被重命名為文件。與前面的範例相比,這更具可讀性:

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

在哪裡,

-0 如果有空格或字元(包括換行符),許多命令將不起作用。此選項負責處理帶有空格的文件名。

-I 用從標準輸入讀取的名稱替換初始參數中出現的 replace-str。此外,未加引號的空格不會終止輸入項;相反,分隔符是換行符。

引用自:https://unix.stackexchange.com/questions/341554