Bash
如何遞歸地將具有一個副檔名的所有文件重命名為不同的副檔名
假設我有一個文件夾:
/ /a.bub /v.bub /dr.bub /catpictures /catpictures/or.bub /catpictures/on.bub
如何格式化腳本以將其中的每一個更改為
.aaa
.這是我所擁有的,儘管這似乎是一種錯誤的方法:
find -type f -name "*.bub" -print0 -exec mv
你可以使用
find
andxargs
:$ find some_folder -type f -name "*.bub" | sed "s/\.bub$//" | xargs -I% mv -iv %.bub %.aaa `some_folder/a.bub' -> `some_folder/a.aaa' `some_folder/v.bub' -> `some_folder/v.aaa' `some_folder/dr.bub' -> `some_folder/dr.aaa' `some_folder/catpictures/or.bub' -> `some_folder/catpictures/or.aaa' `some_folder/catpictures/on.bub' -> `some_folder/catpictures/on.aaa'
…您可以將其概括為 bash 函式:
$ extmv () { find "${1}" -type f -name "*.${2}" | sed "s/\.${2}$//" | xargs -I% mv -iv "%.${2}" "%.${3}" }
…你會這樣使用:
$ extmv some_folder/ bub aaa
最簡單的方法是使用 bash 本身:
for f in *.bub; do mv "$f" "${f/.bub/.aaa}"; done
正如@ZeroPiraeus 和@HaukeLaging 非常正確地指出的那樣,這不是遞歸的。
globstar
您可以通過啟動選項使其遞歸:shopt -s globstar for f in **/*.bub; do mv "$f" "${f/.bub/.aaa}"; done
對於舊版本的 bash,請使用
find
:find -type f -name "*.bub" | while read f; do mv "$f" "${f/.bub/.aaa}"; done