while read方法(純粋なbash)

while read方法(純粋なbash)

コマンドの実行結果に基づいてテキストストリームをフィルタリングする標準ツールはありますか?

grepたとえば、これを考えてみましょう。正規表現に基づいてテキストストリームをフィルタリングできます。しかし、より一般的な問題は、フィルタを拡張することです。たとえば、特定の基準に一致するすべてのファイルを選択したり(find利用可能なスキャンが非常に多いがとにかくサブセット)、他のプログラムを使用してデータをフィルタリングしたりできます。次のパイプラインを考えてみましょう。

produce_data | xargs -l bash -c '[ -f $0 ] && ping -c1 -w1 $1 && echo $0 $@'

まったく役に立ちませんが、一般的なアプローチを提供します。 bash onelinerを使用して各行をテストできます。この例では、既存のファイルとアクセス可能なホストで構成される行が必要です。私はこれを行う標準的なツールが欲しいです。

produce_data | super_filter -- bash -c '[ -f $0 ] && ping -c1 -w1 $1'

以下で簡単に使用できますfind

find here | super_filter -- test -r

find私がいつも忘れてしまった特定のフラグの代わりに一般的なツールを使ってファイルをフィルタリングする方法に注意してください。

より現実的な例は、特定のシンボルを含むオブジェクトファイルを見つけることです。これらのツールは役に立ちます。

したがって、super_filterすべての条件チェッカーはストリーミングモードで実行できます。構文はinxargsまたはに似ていますparallel

答え1

追加すると、GNUパラレルは機能しませんか&& echo

... | parallel 'test -r {} && echo {}'

答え2

while read方法(純粋なbash)

while read入力を1行ずつ処理するための一般的な慣用語です(ファイルの行を繰り返す方法は?)。echo元の入力ラインに対して検査および条件付き操作を実行します。

... | while IFS= read -r line; do test -r "$line" && echo "$line"; done

特別な場合:find

検索結果を繰り返すのはなぜ悪い習慣ですか?

find-exec任意のタスクを実行し、見つかったファイルを確認することがあります。

からman find

-exec command ;
   Execute  command;  true  if 0 status is returned.  All following arguments to
   find are taken to be arguments to the command until an argument consisting of
   `;' is encountered.  The string `{}' is replaced by the current file name be‐
   ing processed everywhere it occurs in the arguments to the command, not  just
   in  arguments  where it is alone, as in some versions of find.  Both of these
   constructions might need to be escaped (with a `\') or quoted to protect them
   from  expansion  by  the shell.  See the EXAMPLES section for examples of the
   use of the -exec option.  The specified command is run once for each  matched
   file.  The command is executed in the starting directory.  There are unavoid‐
   able security problems surrounding use of the -exec action;  you  should  use
   the -execdir option instead.

例:

find here -exec test -r {} \; -print

-execジョブはデフォルトの-printジョブをオーバーライドするため、-print明示的に指定する必要があります。この動作は、find(1) のマニュアルページの EXPRESSION セクションで説明されています。追加の処理を適用するには、代わりに-print0+を使用してください。xargs --null-print

関連情報