假设我有一个文件夹:
/
/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
您可以使用find
和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