フォルダがあるとしましょう。
/
/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