Find
可以使用管道代替 exec in -find / -name “.txt” -exec cp {} /junk ;
如果我想查找名稱中帶有 .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。此外,未加引號的空格不會終止輸入項;相反,分隔符是換行符。