1. ホーム
  2. bash

[解決済み] xargsコマンドで>を使用するには?

2022-04-20 18:58:29

質問

あるディレクトリ内のすべてのファイルを grep して、その出力を別のファイルに書き出すような bash コマンドを見つけたいのです。 私の推測では、次のようなことをするはずでした。

ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"

が、私の知る限り、xargsはダブルクオートを好まないようです。 しかし、もし私がダブルクオートを削除したら、このコマンドはコマンド全体の出力を一連の個別のファイルではなく、'{}'.outという単一のファイルにリダイレクトしてくれます。

どなたか、xargsを使ってこれを行う方法をご存じないでしょうか? 私はこのgrepのシナリオをxargsの問題を説明するための例として使用しただけなので、xargsを使用しない解決策は私には当てはまりません。

解決方法は?

間違えてやらないようにしましょう。

sh -c "grep ABC {} > {}.out"

これは、おかしなファイル名や正しく引用することが不可能な場合など、様々な条件下で壊れます。あなたの {} は、コードインジェクションのバグを避けるため、常に完全に独立した1つのコマンドの引数でなければなりません。 必要なことは、次のとおりです。

xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}

に適用されます。 xargs と同様に find .

ちなみに、xargsを使うときは、絶対に -0 オプションがあります (ただし、非常に稀で、データを破壊する心配のない、制御された一回限りの対話的な使用は除きます)。

また ls . これまで グロビングを使うか find の代わりに http://mywiki.wooledge.org/ParsingLs

使用方法 find は再帰が必要なもの全てに使用し、それ以外はグロブを使った単純なループを使用します。

find /foo -exec sh -c 'grep "$1" > "$1.out"' -- {} \;

または非再帰的である。

for file in *; do grep "$file" > "$file.out"; done

引用符が適切に使用されていることに注意してください。