如何递归地将具有一个扩展名的所有文件重命名为不同的扩展名

如何递归地将具有一个扩展名的所有文件重命名为不同的扩展名

假设我有一个文件夹:

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

如何格式化脚本以将其中每一个更改为.aaa.

这是我所得到的,尽管这似乎是一个错误的方法:

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

答案1

最简单的方法是使用 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

答案2

您可以使用findxargs

$ 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

相关内容