いくつかのファイルの名前を変更し、他のファイルをディレクトリから除外したいと思います。頑張った
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 コマンドはどのように機能しますか?詳細については。