Bash

如何遞歸地將具有一個副檔名的所有文件重命名為不同的副檔名

  • June 10, 2013

假設我有一個文件夾:

/
/a.bub
/v.bub
/dr.bub
/catpictures
/catpictures/or.bub
/catpictures/on.bub

如何格式化腳本以將其中的每一個更改為.aaa.

這是我所擁有的,儘管這似乎是一種錯誤的方法:

find -type f -name "*.bub" -print0 -exec mv

你可以使用findand xargs

$ 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

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