Shell

多個重命名文件

  • June 27, 2013

可能重複:

如何清理文件副檔名?

我想將副檔名為 .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'

引用自:https://unix.stackexchange.com/questions/11011