時々、xargs
置換文字列を明示的に使用する必要がないことがあります。
find . -name "*.txt" | xargs rm -rf
他の場合には、次のようなことを行うために置換文字列を指定する必要があります。
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
前のコマンドは、現在のディレクトリの下にあるすべてのテキスト ファイルを に移動し、すべてのファイルに/foo
拡張子を追加します。bar
置換文字列にテキストを追加する代わりに、ファイル名と拡張子の間にテキストを挿入できるように文字列を変更したい場合、どうすればよいでしょうか。たとえば、前の例と同じことをしたいが、ファイルを から (ではなく)に名前変更/移動したいと<name>.txt
し/foo/<name>.bar.txt
ます/foo/<name>.txt.bar
。
アップデート: なんとか解決策を見つけました:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
しかし、もっと短くて良い解決策があるのだろうか。
ベストアンサー1
次のコマンドは、xargs を使用して移動コマンドを構築し、2 番目に出現する '.' を '.bar.' に置き換えてから、Mac OSX で動作する bash を使用してコマンドを実行します。
ls *.txt | xargs -I {} echo mv {} foo/{} | sed 's/\./.bar./2' | bash