
我有很多資料夾和子資料夾,其中的檔案名稱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
作用類似於啟用nullglob
和dotglob
in 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
。