Shell

刪除文件名中的倒數第二個副檔名

  • December 23, 2014

假設一個文件夾包含許多副檔名錯誤的文件,例如

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 個,則這樣做的好處是什麼都不做。

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