Làm cách nào tôi có thể in nội dung thay vì tên tệp từ lệnh linux find?


10

Tôi có hàng ngàn tập tin không tên được đặt tên như thế này cbs_cdr_vou_20180624_603_126_239457.unl. Tôi muốn in tất cả các dòng từ các tệp đó bằng cách sử dụng lệnh sau. nhưng nó chỉ cho tôi tên tập tin. Tôi không cần tên tệp, tôi chỉ cần nội dung từ các tệp đó.

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

Sản lượng hiện tại:

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

Sản lượng dự kiến:

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

Xin lưu ý rằng, đối với lệnh cat, tôi gặp lỗi như -bash: /bin/logger: Argument list too longtại sao muốn sử dụng findthay vì catlệnh.


Bạn vẫn cần sử dụng cat.
Ignacio Vazquez-Abrams

Đúng! Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể làm điều đó? @ IgnacioVazquez-Abrams
Rezuan

Câu trả lời:


28

Các findtiện ích thỏa thuận với tên đường dẫn. Nếu không có hành động cụ thể nào được đề cập trong findlệnh cho các tên đường dẫn được tìm thấy, thì hành động mặc định là xuất chúng.

Bạn có thể thực hiện một hành động trên các tên đường dẫn được tìm thấy, chẳng hạn như đang chạy cat, bằng cách thêm -execvào findlệnh:

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

Điều này sẽ tìm thấy tất cả các tệp thông thường trong hoặc dưới thư mục hiện tại, có tên khớp với mẫu đã cho. Đối với các lô lớn nhất có thể, catsẽ được gọi để nối các nội dung của tệp.

Đầu ra sẽ đi đến /home/fifa/cbs/test.txt.

Liên quan:


1
Làm việc như mong đợi và thời gian thực hiện là rất nhanh, điều đó thực sự tuyệt vời. Cảm ơn nhiều.
Rezuan

12

Đầu ra của findkết quả sẽ với các tên tệp có liên quan.
Bạn có thể pipe ( |) đầu ra xargs catsẽ thực hiện catlệnh trên mỗi tệp.

ví dụ:

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

Một lựa chọn khác sẽ là sử dụng -exec cat

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

4
Cả hai lệnh của bạn đều hoạt động tốt. Nhưng chậm hơn một chút so với mệnh lệnh của Kusalananda . Tôi đoán, thời gian thực hiện là khác nhau -exec cat {} \;-exec -cat {} +. Nhân tiện, cảm ơn rất nhiều Yaron.
Rezuan

xargs dễ bị tổn thương bởi các khoảng trắng trong tên đường dẫn được tìm thấy; exec mèo {} không phải là
Jez

2
find -print0 | xargs -0không dễ bị tổn thương bởi dấu cách / dấu ngoặc kép / v.v.
lông mịn

1
@Rezuan: -exec cat {} \;chạy cat riêng cho từng tệp thay vì gộp chúng lại với nhau như xargs. Đừng sử dụng nó trừ khi bạn rõ ràng muốn điều đó (ví dụ: một lệnh chỉ hoạt động cho một tệp tại một thời điểm) hoặc nếu bạn cần tính di động cho một hệ thống không có -exec ... +và không có -print0/ xargs -0. Mặc dù vậy, tôi hơi ngạc nhiên find|xargslà chậm hơn so với -exec cat {} +. Bạn có rất ít tập tin, vì vậy chi phí khởi động rất nhiều chi phí? Hay bạn chỉ có thời gian xargsphiên bản trong khi bộ đệm đĩa của bạn lạnh?
Peter Cordes

1
@PeterCordes cảm ơn đã giải thích. Đó là cho bộ đệm đĩa, tôi nhận ra sau này.
Rezuan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.