隣接する大文字と小文字の間にスペースを含めるように、camelCaseファイルの名前を一括変更しようとしています。私はMac OSを使用しているので、私が使用するユーティリティはBSDのバリエーションです。
たとえば、
250 - ErosPhiliaAgape.mp3 => 250 - Eros Philia Agape.mp3
find
次のコマンドを使用して、関連ファイルをサブシェルでmv
実行されているファイルにパイプしようとします。sed
find . -name "*[a-z][A-Z]*" -print0 | xargs -0 -I {} mv {} "$(sed -E 's/([a-z])([A-Z])/\1 \2/g')"
このコマンドだけでも正常に動作します。find
正しいファイルを抽出してsed
名前を正しく変更しましたが、xargsと組み合わせると何も起こりません。
これを行うには何を変更する必要がありますか?
ベストアンサー1
問題は、コマンドのサブシェルがファイル単位では$(...)
なく、コマンドが実行されたときに評価されることです。 'sをxargs
使用して、a内の各ファイルのコマンド数を計算し、参照を適切に置き換えることができます。find
-exec
sh
find . -name "*[a-z][A-Z]*" -type f -exec sh -c 'echo mv -v "{}" "$(echo "{}" | sed -E "s/([a-z])([A-Z])/\1 \2/g")"' \;
この出力が良好に見える場合は、echo
inを削除してくださいecho mv
。 .echo | sed
\n