Shell-Script

通過刪除分隔子字元串重命名文件

  • March 29, 2020

我有很多文件夾和子文件夾,其中的文件名為1. Introduction--- [ FreeCourseWeb.com ] ---.mp4我想遞歸地重命名所有文件(文件夾和子文件夾)以僅1. Introduction.mp4抑制 substring --- [ FreeCourseWeb.com ] ---

假設您要重命名名稱開頭有數字的所有文件,包含---兩次子字元串,緊隨其後.mp4的是名稱的最後。此外,假設您要刪除兩個---子字元串之間的位,包括這些子字元串本身:

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
   for pathname do
       mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
   done' sh {} +

這會在目前目錄中或目前目錄下查找名稱與給定模式匹配的所有正常文件,然後刪除匹配的後綴字元串---*---.mp4並重新添加.mp4後綴。

不使用find(in bash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
   [[ ! -f $pathname ]] && continue
   mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

這與命令本質上相同find,但也會重命名符號連結。開始時設置的三個 shell 選項啟用**用於遞歸匹配子目錄的通配模式 ( globstar),確保刪除不匹配的模式而不是保持未擴展 ( nullglob),並確保通配模式匹配隱藏的名稱 ( dotglob)。

zsh外殼中:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
   mv -i $pathname ${pathname%---*---.mp4}.mp4
done

在這裡, glob 限定符中的點(.ND)使前面的模式只匹配正常文件,而N和的D作用類似於 enablenullglobdotglobin bash,但僅適用於這個特定的模式。

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