透過刪除分隔子字串來重新命名文件

透過刪除分隔子字串來重新命名文件

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

答案1

假設您要重新命名名稱開頭有數字、包含---兩次子字串、緊接著.mp4名稱末尾的所有檔案。此外,假設您要刪除兩個子字串之間的位元---(包括這些子字串本身):

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

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

不使用find(中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作用類似於啟用nullglobdotglobin bash,但僅適用於此特定模式。

答案2

使用套件rename的工具util-linux(有時稱為rename.ul)和find

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

選項-i請求覆蓋現有文件的權限。


使用 Larry Wall 的 Perlrename腳本和find

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

除非使用-f/選項,否則預設不會覆蓋現有檔案。--force您將看到一條錯誤訊息... already exists

相關內容