我正在嘗試將文件從當前目錄移動到另一個目錄。我遇到的問題是多個文件的名稱帶有特殊字符,例如space, ü, &, (, ...
.如何使用以下命令移動所有檔案:ls | grep mp4 | xargs -i mv {} mp4
,其中{}
應該是目前檔案的名稱,而 mp4 是放置所有檔案的目的地。我已經嘗試過該命令,但它顯示錯誤。你能幫忙嗎?
答案1
情況正是如此你不想使用ls
或xargs
使用預設設置,它將按空格分割輸入,並專門處理引號和反斜線。您需要使用-0
分隔空位元組的輸入,或-d'\n'
分隔換行符號(GNU xargs)來關閉該行為。
由於所有檔案都位於同一目錄中,因此您可以使用 shell:
mv *mp4* mp4/
或者,如果您僅指具有副檔名mv *.mp4 mp4/
的檔案。mp4
第一個會警告mp4
自己移動到mp4
。
如果檔案不在同一目錄中,則需要使用雙星(zsh
- 預設啟用或ksh
withset -o globstar
或bash
with shopt -s globstar
):
mv **/*mp4* mp4/
或者find
find . -type f -name "*mp*" -exec mv {} mp4/ \;
答案2
命令:
ls | grep mp4 | xargs -i mv {} mp4
在大多數情況下可以被更簡單和更強大的取代:
mv *mp4* mp4
您可以忽略目錄 mp4 不可在其內部移動的警告。
請注意,此腳本與您的腳本一樣,正在移動mp4
名稱中任何位置出現「 」的所有檔案(例如:mp4list.txt
, lamp4.jpg
)。如果您實際上只想移動擴展名為“ .mp4
”的文件,您可以使用:
mv *.mp4 mp4
mp4
這將防止出現導致有關目錄本身的錯誤訊息的情況。
如果 mp4 檔案的數量很大並且阻止前一個命令工作,您可以使用 GNUfind
來實現相同的目的:
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
或者
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +