私はこれを実行しようとしています:
locate pg_type.h | cat
しかし、このコマンドは単にpg_type.hを見つけることと同じです。
何を変更すればよいですか?やりたいcat pg_type.h
どこでもpg_type.h
多分。
locate -e0 '*/pg_type.h' | xargs -r0 cat
locate pg_type.h
は、パスにpg_type.h
が含まれるすべてのファイルを検索します(たとえば、rpg_type.horn
ディレクトリがあった場合、そこにすべてのファイルが表示されることになります)。
-0
がないと、locate
の出力を後処理できません。これは、ファイルが改行文字で区切られている一方で、改行はファイル名で完全に有効な文字であるためです。
cat
は引数なしでstdoutに書き込み、stdinから読み取ったものを書き込むため、locate | cat
はlocate
と同じで、cat
はlocate
に沿って。必要なのは、ファイルのリストをargumentsとしてcat
に渡すことです。
これがxargs
の一般的な目的です。データのストリームを引数のリストに変換します。 -r
は、入力がない場合にcat
を呼び出さないことです。 -0
がない場合(-r
は標準ではありませんが、多くの実装で見られますが、少なくともxargsが何かに役立つ場合)、xargs
はwords入力で引数に変換します。ここでwordsは空白で区切られ、バックスラッシュ、シングル、二重引用符はこれらの区切り文字をエスケープするために使用できるため、通常、locate
がファイル名の表示に使用する形式ではありません。
そのため、locate
とxargs
の両方に-0
オプションを使用して、NUL文字(ファイルパスで使用できない唯一の文字)を使用してファイル名を区切ります。
また、locate
は標準のコマンドではなく、バージョンやオプション、動作が異なる多数の実装が存在することにも注意してください。上記のコードは、少なくとも比較的最近のバージョンのGNU locate
およびmlocate
実装)に適用されます。これらの実装は、少なくともLinuxベースのオペレーティングシステムで最も一般的です。
コマンドは、locate
の出力を標準入力のcat
に渡します。それはあなたが望むものではありません。 yoで必要なのは、locate
の出力をcat
にargumentとして渡すことです。
これを行う方法はxargs
を使用することだと思います。
locate pg_type.h | xargs cat