私がフォルダを持っているとしましょう:
/
/a.bub
/v.bub
/dr.bub
/catpictures
/catpictures/or.bub
/catpictures/on.bub
スクリプトをフォーマットして、これらをそれぞれ.aaa
に変更するにはどうすればよいですか。
これは私が持っているものですが、それは間違ったアプローチのようです:
find -type f -name "*.bub" -print0 -exec mv
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
最も簡単な方法は、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