3

私は次の行で何かをしたい:

find -name *.mk | xargs "for i in $@ do mv i i.aside end"

これにはエラー以上のものがあるかもしれないことを私は理解していますが、xargsを渡すことができるこの種のインラインコマンド定義について具体的に知りたいです。

4

5 に答える 5

6

この特定のコマンドは良い例ではありませんが、コマンドとして指定することで「インラインシェルスクリプト」を使用できます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を実行する他の多くの方法と比較して低速です。いくつかのクールな構文を示すためだけに投稿しています。

于 2012-07-02T15:03:31.680 に答える
4

ここではxargsは必要ありません

find -name *.mk -exec mv {} {}.aside \;

于 2012-07-02T14:30:52.967 に答える
0

forループのセマンティクスがどうあるべきかはわかりませんが、盲目的にコーディングすると、次のようになります。

find -name *.mk | while read file
  do
    for i in $file; do mv $i $i.aside; done
  done

ボディが複数の場所で使用されている場合は、bash関数を使用することもできます。

于 2012-07-02T14:33:12.903 に答える
0

findの一部のバージョンでは、引数が必要です:。現在のディレクトリ

スター*はエスケープする必要があります

echoコマンドを試して、どのコマンドが実行されるかを確認できます

find . -name '*.mk' -print0 | xargs -0i sh -c "echo mv '{}' '{}.aside'" 
man xargs
/-i
man sh
/-c
于 2012-07-02T14:49:18.080 に答える
0

私はあなたがこれを素晴らしい方法で行うことができると確信しています、しかしあなたがxargsを要求したので:

find -name "*.tk" | xargs -I% mv % %.aside

一度に名前を変更できるのは1つだけなので、ファイル名をループしても意味がありません。インラインの醜さを使用する必要はありませんが、パイプとまたはのいずれかで動作させることができませんでしevalbash -c

于 2012-07-02T14:50:04.640 に答える