Shell-Script
通過刪除分隔子字元串重命名文件
我有很多文件夾和子文件夾,其中的文件名為
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
(inbash
):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
作用類似於 enablenullglob
和dotglob
inbash
,但僅適用於這個特定的模式。