web-dev-qa-db-ja.com

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

私はこのようなcbs_cdr_vou_20180624_603_126_239457.unlのような名前の何千もの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のようなエラーが発生するので、findコマンドの代わりにcatを使用したいことに注意してください。

10
Rezuan

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

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

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

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

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

関連:

28
Kusalananda

findの出力には、関連するファイル名が含まれます。
パイプで(_|_)出力を_xargs cat_にパイプすると、各ファイルでcatコマンドが実行されます。

例えば。:

_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
_
12
Yaron