考える
[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d | ls
bin dev home lib64 media opt root sbin sys usr
boot etc lib lost+found mnt proc run srv tmp var
lsは何もしません。構造ディメンションのlsリストに書き換える必要があります。
find . -type d | xargs ls
#millions of outputs
しかし、grepは素晴らしい仕事をします。
[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d | grep home
./home
命令が試行錯誤テストと暗記ではなく、2番目の放射体として生まれたのではないという基本的な理解をどのように理解できますか?
答え1
さまざまなプログラムの機能を学び、覚えたり、マニュアルページを読んでください。
説明ls
は次のとおりです
ファイルに関する情報のリスト(デフォルトは現在のディレクトリ)
ここで、FILE は要約を表します。
ls [オプション]... [ファイル]...
覚えておくべき重要な部分は、ls
あなたが提供した「ファイル」に関する情報を生成することです。コマンドラインから。マニュアルでは、ls
入力(パイプからなど)を読み取る方法については説明していません。
ls
たとえば、マニュアルページをcat
マニュアルページと比較します。
cat [オプション]... [ファイル]...
ファイルを標準出力に接続します。 FILE がない場合、または FILE が - の場合、標準入力を読み込みます。
それでcat
あなたはすることができます、cat /some/file
またはあなたはできますecho hi | cat
。
最初の例では
find . -maxdepth 2 -type d | ls
find
一部の操作を実行し、標準出力にいくつかのディレクトリ名を渡したり渡したりしないと、そのディレクトリ名は標準入力になり、ls
すぐls
に無視されます。一覧表示するファイルを提供しないため、既定ではls
現在のディレクトリを一覧表示します。
2番目の例では
find . -type d | xargs ls
find
(より多くの)操作を実行し、標準出力にすべてのディレクトリを作成してからxargs
標準入力としてレンダリングします。マニュアルページの一部はxargs
次のとおりです。
xargsは標準入力から項目を読み取り、コマンドを1回以上実行します。
stdinの入力行数が与えられると、ls
必要なだけ呼び出されます。
3番目のコマンドにも同じアイデアが適用されます。
find . -maxdepth 2 -type d | grep home
find
ディレクトリ名をgrep
stdinに戻します。 grepのマニュアルページには、次の内容が部分的に記載されています。
grep は、指定された入力ファイルから指定されたパターンに一致する行を検索します。ファイルが指定されていない場合、またはファイル「-」が指定されている場合、grepは標準入力を検索します。
パイプのアイデアはシンプルだが強力です。プログラムが生成する出力と、プログラムが標準入力で入力を使用できるかどうかを知るだけです。
grep
このような状況で最も一般的に使用されるツールの1つです。以下を基本コマンドとして使用できます。
grep some-text file1 file2 file3 ...
この場合、grep
ファイル名を知っているか、標準入力として入力を送信できます。
cat file1 file2 file3 ... | grep some-text
...この場合、grepはもはやファイル名を知らないので(cat
ファイル名を知ってその内容を標準出力として生成する)、grepはどのファイルにテキストが含まれているのかわかりません。できません。
複数のコマンドを一緒に接続したい誘惑があります(「単一行」がターミナルウィンドウで2行目を囲むほど長くなる可能性があるため、冗談半分として「単一行」とも呼ばれます)。同様に、プログラムが入力を生成して消費する方法を正確に知る必要があります。
file1
、およびfile2
というファイルが与えられた場合file3
できる次のようにしてください。
find . -name 'file*' | xargs cat
find
3つのファイル名が標準出力として生成されても驚くことはありません。
file1
file2
file3
... xargsはリストをコンパイルして次に送信しますcat
。
cat file1 file2 file3
...その3つのファイル名を見てその内容を画面に忠実にダンプする人。
上記find
のコマンドは「filenamehere」というファイルを出力します。
file name here
file1
file2
file3
... xagsはこれのリストをコンパイルしますcat
。
cat file name here file1 file2 file3
...cat
それについて文句を言う(stderrに!):
cat: file: そのファイルやディレクトリはありません。
cat:名前:そのファイルまたはディレクトリはありません。
cat:ここ:そのファイルやディレクトリはありません
...次に、file1、file2、およびfile3の内容が続きます。
これで、ファイル名の区切り文字としてNULLを使用するfind ... -exec
などの代替方法を使用して、この状況を回避する準備が整いました。find ... -print0 | xargs -0 ...