Linuxのfindコマンドを使用して、ファイル名ではなく内容を出力するにはどうすればよいですか?


10

私はこのような名前の何千ものunlファイルを持っていますcbs_cdr_vou_20180624_603_126_239457.unl。次のコマンドを使用して、これらのファイルのすべての行を印刷したいと思いました。しかし、それは私にファイル名だけを与えます。ファイル名は必要ありません。ファイルの内容が必要です。

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

現在の出力:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

予想される出力:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

catコマンドの-bash: /bin/logger: Argument list too long場合findcatコマンドの代わりに使用したかったので、エラーが発生することに注意してください。


まだ使用する必要がありますcat
Ignacio Vazquez-Abrams

はい!どうすればできるのか教えていただけますか?@ IgnacioVazquez-Abrams
Rezuan

回答:


28

findユーティリティは、パス名を扱います。find見つかったパス名のコマンドで特定のアクションが指定されていない場合、デフォルトのアクションはそれらを出力することです。

次のコマンドにcat追加-execすることで、見つかったパス名に対して、runningなどのアクションを実行できますfind

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

これにより、現在のディレクトリ内またはその下にある、指定されたパターンに名前が一致するすべての通常のファイルが検索されます。これらの可能な限り大きなバッチの場合cat、ファイルの内容を連結するために呼び出されます。

出力はに送られ/home/fifa/cbs/test.txtます。

関連:


1
期待通りに動作し、実行時間は非常に速く、本当に素晴らしいです。どうもありがとう。
Rezuan

12

の出力はfind、関連するファイル名で行われます。各ファイルでコマンドを実行する出力を
パイプ(|)できます。xargs catcat

例えば:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

別のオプションは使用することです -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt

4
コマンドはどちらも正常に機能しています。しかし、Kusalanandaのコマンドより少し遅い。私が推測する、実行時間が上で変化している-exec cat {} \;-exec -cat {} +。ちなみに、ヤロンさん、ありがとうございました。
Rezuan

xargsは、見つかったパス名のスペースに対して脆弱です。-exec cat {}はありません
jez

2
find -print0 | xargs -0スペース/引用符などに対して脆弱ではありません。
フワフワした

1
@Rezuan:-exec cat {} \;xargsのようにバッチ処理するのではなく、ファイルごとに個別にcatを実行します。あなたが明示的に(一度に一つのファイルのために働くことを例えばコマンド)を使用する場合に限り、またはあなたがすることなく、システムへの移植が必要な場合には使用しないでください-exec ... +とせず-print0/ xargs -0。とはいえ、それfind|xargsよりもかなり遅いのには少し驚いて-exec cat {} +います。合計ファイルが非常に少ないので、起動時のオーバーヘッドがコストの大部分ですか?またはxargs、ディスクキャッシュが冷えているときにのみバージョンの時間を計測しましたか?
Peter Cordes

1
説明をありがとう@PeterCordes。それはディスクキャッシュ用でした。後で気づきました。
Rezuan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.