Shell
刪除文件名中的倒數第二個副檔名
假設一個文件夾包含許多副檔名錯誤的文件,例如
Song1.avi.mp3 Song2.avi.mp3 Song32.web.mp3 Song23.mp4.mp3 Song2a.mp9.mp3
我只想刪除第二個欄位(
web
,avi
,mp4
)。我知道如何使用 sed 但我必須添加副檔名mv -v $i "$(echo $i|sed 's:.flv::g;s:.avi::g;s:.mp4::g')"
有人知道使用 sed 或 awk 或 perl 僅刪除第二個壞副檔名的即時方法嗎?
您不需要任何外部實用程序,您可以使用shell 自己的字元串操作功能來完成。這樣可以更輕鬆地避免使用特殊字元破壞文件名。並記住始終在變數替換周圍使用雙引號。
mv -v -- "$i" "${i%.*.*}.${i##*.}"
(顯然,這個片段假定文件名確實包含兩個副檔名。如果不包含,
${i%.*.*}
則將是整個文件名。)
使用 bash 正則表達式:
f=foo.bar.baz.qux if [[ $f =~ (.+)\.[^.]+\.([^.]+)$ ]];then new="${BASH_REMATCH[1]}.${BASH_REMATCH[2]}" if [[ -f "$new" ]]; then echo "moving $f would overwrite $new" else echo mv "$f" "$new" fi fi
mv foo.bar.baz.qux foo.bar.qux
如果名稱中的點少於 2 個,則這樣做的好處是什麼都不做。