xargs の置換文字列を変更する 質問する

xargs の置換文字列を変更する 質問する

時々、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

おすすめ記事