為什麼我的管道無法運作?

為什麼我的管道無法運作?

我正在嘗試製作一個 bash 腳本,該腳本將找到“下載”資料夾中的所有 mp3 並將它們移至音樂資料夾中。為什麼這條線行不通?

find ./ -type f -name \*.mp3 | mv *.mp3 /home/mitch/Desktop/Music/$ARTIST

我嘗試使用管道將第一個命令中的信息轉換為第二個命令,但我以前從未使用過管道,不知道我是否做錯了,或者我對它們的用途是否有錯誤的想法為了。

答案1

mv命令不使用其標準輸入,因此您必須將標準輸入轉換為參數,為此可以使用xargs

find ./ -type f -name '*.mp3' | xargs mv -t /home/mitch/Desktop/Music/$ARTIST

另外,您可以直接使用以下-exec操作find

find ./ -type f -name '*.mp3' -exec mv {} /home/mitch/Desktop/Music/$ARTIST ';'

編輯

正如@geirha 所指出的,如果您的檔案名稱包含空格,第一個命令將無法運作。在這種情況下,應該如下所示

find ./ -type f -name '*.mp3' -print0 | xargs -0 mv -t /home/mitch/Desktop/Music/$ARTIST

答案2

xargs的優點是命令列擴充。如果您有一個命令返回大量文字(或在一個命令上返回許多文件),那麼您將需要 xargs。

如果您的目錄中有數千個檔案並且想要運行該列表中的某些腳本,您可以嘗試“ ./myprogram *”,但是如果您的程式對參數的大小有任何限制,您可能會透過擴展 *.此外,命令列本身也有限制,因此命令可能會因為命令列緩衝區溢位而失敗。使用 xargs 可以避免這個問題。

最後,find 上的 -print0 將為傳回的檔案名稱中的空格添加空分隔符,xargs 上的 -0 選項將解釋這些空值。讀man xargs

相關內容