私は次の行で何かをしたい:
find -name *.mk | xargs "for i in $@ do mv i i.aside end"
これにはエラー以上のものがあるかもしれないことを私は理解していますが、xargsを渡すことができるこの種のインラインコマンド定義について具体的に知りたいです。
この特定のコマンドは良い例ではありませんが、コマンドとして指定することで「インラインシェルスクリプト」を使用できますsh -c 'here is the script'
。そして、スクリプト内で$ @になる引数を指定できますが、落とし穴があります。後の最初の引数here is the script
はスクリプト内で$ 0になるため、そこに余分な単語を追加する必要があります。そうしないと、最初の引数が失われます。
find . -name '*.mk' -exec sh -c 'for i; do mv "$i" "$i.aside"; done' fnord '{}' +
私が利用したもう1つの楽しい機能は、forループがデフォルトでコマンドライン引数を反復処理するという事実ですfor i; do ...
。for i in "$@"; do ...
繰り返しますが、上記のコマンドは複雑で、バルクmvを実行する他の多くの方法と比較して低速です。いくつかのクールな構文を示すためだけに投稿しています。
ここではxargsは必要ありません
find -name *.mk -exec mv {} {}.aside \;
forループのセマンティクスがどうあるべきかはわかりませんが、盲目的にコーディングすると、次のようになります。
find -name *.mk | while read file
do
for i in $file; do mv $i $i.aside; done
done
ボディが複数の場所で使用されている場合は、bash関数を使用することもできます。
findの一部のバージョンでは、引数が必要です:。現在のディレクトリ
スター*はエスケープする必要があります
echoコマンドを試して、どのコマンドが実行されるかを確認できます
find . -name '*.mk' -print0 | xargs -0i sh -c "echo mv '{}' '{}.aside'"
man xargs
/-i
man sh
/-c
私はあなたがこれを素晴らしい方法で行うことができると確信しています、しかしあなたがxargsを要求したので:
find -name "*.tk" | xargs -I% mv % %.aside
一度に名前を変更できるのは1つだけなので、ファイル名をループしても意味がありません。インラインの醜さを使用する必要はありませんが、パイプとまたはのいずれかで動作させることができませんでしeval
たbash -c
。