[解決済み] xargsコマンドで>を使用するには?
質問
あるディレクトリ内のすべてのファイルを 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
引用符が適切に使用されていることに注意してください。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Git上でシェルコマンドを実行する際に使用するSSH-keyの秘密鍵を指定する方法は?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Bashのif条件で「unary operator expected」エラーが発生する。
-
[解決済み】Bashのシンタックスエラー:予期しないファイルの終わり
-
[解決済み] '\r': command not found - .bashrc / .bash_profile [duplicate].
-
[解決済み] bash スクリプトの "${BASH_SOURCE[0]}" と $( cd $( dirname "xxx" && pwd )) の意味について
-
[解決済み] eval "$(docker-machine env default) "とする。
-
[解決済み] Curl:応答を待たない[重複]。
-
[解決済み] bashで::演算子は何をするのですか?
-
解決策:bash: /root/.bashrc: パーミッションが拒否されました
-
[解決済み] condaのアップデート後、ターミナルのプロンプトから(base)を削除する方法
-
[解決済み] ターミナルでbashスクリプトを実行するにはどうすればよいですか?