web-dev-qa-db-ja.com

ある拡張子を持つすべてのファイルの名前を別の拡張子に再帰的に変更するにはどうすればよいですか?

私がフォルダを持っているとしましょう:

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

スクリプトをフォーマットして、これらをそれぞれ.aaaに変更するにはどうすればよいですか。

これは私が持っているものですが、それは間違ったアプローチのようです:

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

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
6
user27282

最も簡単な方法は、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
11
terdon