ディレクトリ内のすべてのファイルをgrepし、そのgrepの出力を別のファイルに書き込むことができるbashコマンドを見つけたいと思います。私の推測では、このようなことをすることだったでしょう
ls -1 | xargs -I{} "grep ABC '{}' > '{}'.out"
しかし、私が知る限り、xargsは二重引用符を好みません。ただし、二重引用符を削除すると、コマンドはコマンド全体の出力を、一連の個別のファイルではなく、「{}」。outという単一のファイルにリダイレクトします。
xargsを使用してこれを行う方法を知っている人はいますか?このgrepシナリオを例として使用して、xargsの問題を説明したので、xargsを使用しないソリューションは私には当てはまりません。
これを間違えないでください:
sh -c "grep ABC {} > {}.out"
これは、ファンキーなファイル名を含む多くの条件下で機能しなくなり、正しく引用することは不可能です。あなた{}
必見常にコードインジェクションのバグを回避するためのコマンドへの単一の完全に別の引数で。あなたがする必要があるのはこれです:
xargs -I{} sh -c 'grep ABC "$1" > "$1.out"' -- {}
xargs
同様に適用されますfind
。
ちなみに、-0
オプションなしでxargsを使用しないでください(データの破壊を心配しない、非常にまれで制御された1回限りのインタラクティブな使用を除く)。
また、解析しないでください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
引用符の適切な使用に注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加