
我正在嘗試製作一個 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
。