xargs repl_str は、2 番目のプレースホルダを拡張しません。

xargs repl_str は、2 番目のプレースホルダを拡張しません。

いくつかのファイルの名前を変更し、他のファイルをディレクトリから除外したいと思います。頑張った

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -print0 |
xargs -0 -I {} sudo mv -- {} $(echo {} | sed 's/local.conf/local.example.com.conf/')

しかし、これはうまくいきません。

mvコマンドの2番目のパラメータが正しく拡張されていないようです。

答え1

$(...)シェルはxargsを呼び出す前にこのセクションを評価します。試してみることができるタスクは次のとおりです。

xargs -0 -I {} bash -c 'mv {} $(echo {} | sed "s/local.conf/local.example.com.conf/")'

sedを避けることができます

xargs -0 -I {} bash -c 'f="{}"; mv "{}" "${f/local.conf/local.example.com.conf}"'

利用可能な場合は、コマンドも参照してくださいrename

答え2

xargsそれなしで同様のものを書くことができます

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -exec sh -c '
sudo mv -- "$0" "$(echo "$0" | sed "s/local.conf/local.example.com.conf/")"

'{}\;

バラより"find...-exec sh -c '...' sh {}+" を使用した find コマンドはどのように機能しますか?詳細については。

関連情報