1つの拡張子を持つすべてのファイルの名前を別の拡張子に再帰的に変更する方法

1つの拡張子を持つすべてのファイルの名前を別の拡張子に再帰的に変更する方法

フォルダがあるとしましょう。

/
/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

関連情報