区別コマンドはローカルの2番目の実行プログラムではありません。

区別コマンドはローカルの2番目の実行プログラムではありません。

考える

[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ディレクトリ名をgrepstdinに戻します。 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

find3つのファイル名が標準出力として生成されても驚くことはありません。

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 ...

おすすめ記事