Shell
多個重命名文件
可能重複:
我想將副檔名為 .flac.mp3 的文件重命名為副檔名 .mp3。我使用了以下命令
$ for i in *; do mv $i `echo $i | sed 's/.flac//g'`; done
這將為每個文件寫入以下錯誤消息。
mv: target `file.mp3' is not a directory
我在哪裡做錯了?
謝謝
也許這些文件的名稱包含空格。
shell 程式的簡單規則:始終在變數和命令替換周圍使用雙引號(除非您知道為什麼需要將它們排除在外)。所以:
for i in *; do mv "$i" "$(echo "$i" | sed 's/.flac//g')"; done
當您使用它時,您可以在該命令中做一些更好的事情,即使它們不是您的問題的根源。您應該只對它應該影響的文件執行命令,而不是目前目錄中的每個文件。sed 正則表達式
.flac
可以匹配副檔名以外的內容。如果您的文件名以 a 開頭-
或包含反斜杠(某些版本的echo
),該命令也可能會失敗。for i in *.flac.mp3; do mv -- "$i" "$(echo "$i" | sed 's/\.flac\.mp3$/\.mp3/')"; done
但實際上你不必在這里為 sed 煩惱,這裡有一個 shell 構造可以從字元串中刪除後綴。
for i in *.flac.mp3; do mv -- "$i" "${i%.flac.mp3}.mp3"; done
--
確保即使$i
以 a 開頭-
,也不會被解釋為選項。另一種方法是確保$i
從不以 開頭-
,例如通過確保所有相對文件名都帶有前綴./
(這對指定的文件沒有影響,因為.
是目前目錄)。./*.flac.mp3 中的 i;做MV“ $ i" " $ {i%.flac.mp3}.mp3"; 完成
有很多工具可以自動重命名文件;在此處瀏覽重命名以獲取一些想法。例如,如果你的 shell 是 zsh:
autoload zmv # goes into your .zshrc zmv '(*).flac.mp3' '$1.mp3'