Bagaimana saya bisa mencetak konten alih-alih nama file dari menggunakan perintah linux find?

10

Saya memiliki ribuan file unl bernama sesuatu seperti ini cbs_cdr_vou_20180624_603_126_239457.unl. Saya ingin mencetak semua baris dari file-file itu dengan menggunakan perintah berikut. tapi itu hanya memberi saya nama file. Saya tidak perlu nama file, saya hanya perlu konten dari file-file itu.

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

Output Saat Ini:

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

Output yang diharapkan:

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

Harap dicatat bahwa, untuk perintah cat saya mendapatkan kesalahan seperti -bash: /bin/logger: Argument list too longitu sebabnya saya ingin menggunakan findalih-alih catperintah.

Rezuan
sumber
Anda masih perlu menggunakan cat.
Ignacio Vazquez-Abrams
Iya! Bisakah Anda memberi tahu saya bagaimana saya bisa melakukan itu? @ IgnacioVazquez-Abrams
Rezuan

Jawaban:

28

The findutilitas berhubungan dengan nama path. Jika tidak ada tindakan spesifik yang disebutkan dalam findperintah untuk nama path yang ditemukan, tindakan default adalah untuk menghasilkannya.

Anda mungkin melakukan tindakan pada nama path ditemukan, seperti menjalankan cat, dengan menambahkan -execke findperintah:

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

Ini akan menemukan semua file biasa di atau di bawah direktori saat ini, yang namanya cocok dengan pola yang diberikan. Untuk sebanyak mungkin kumpulan ini, catakan dipanggil untuk menyatukan isi file.

Outputnya akan pergi ke /home/fifa/cbs/test.txt.

Terkait:

Kusalananda
sumber
1
Bekerja seperti yang diharapkan dan waktu pelaksanaan sangat cepat yang sangat bagus. Terimakasih banyak.
Rezuan
12

Output findakan dihasilkan dengan nama file yang relevan.
Anda dapat mem-pipe ( |) output xargs catyang akan melakukan catperintah pada setiap file.

misalnya:

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

Opsi lain adalah menggunakan -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
sumber
4
Kedua perintah Anda berfungsi dengan baik. Tapi sedikit lebih lambat dari perintah Kusalananda . Saya kira, waktu eksekusi bervariasi pada -exec cat {} \;dan -exec -cat {} +. Ngomong-ngomong, terima kasih banyak Yaron.
Rezuan
xargs rentan terhadap spasi di pathnames yang ditemukan; -exec cat {} bukan
jez
2
find -print0 | xargs -0tidak rentan terhadap spasi / kutipan / dll.
lembut
1
@Rezuan: -exec cat {} \;menjalankan cat secara terpisah untuk setiap file alih-alih mengumpulkannya seperti xargs. Jangan menggunakannya kecuali Anda secara eksplisit menginginkannya (mis. Perintah yang hanya berfungsi untuk satu file pada satu waktu), atau jika Anda memerlukan portabilitas ke sistem tanpa -exec ... +dan tanpa -print0/ xargs -0. Saya sedikit terkejut bahwa find|xargsini lebih lambat dari pada diukur -exec cat {} +. Apakah Anda memiliki total file yang sangat sedikit, sehingga biaya overhead startup adalah banyak biaya? Atau apakah Anda hanya mengatur waktu xargsversi sementara cache disk Anda dingin?
Peter Cordes
1
@PeterCordes terima kasih atas penjelasannya. Itu untuk cache disk, saya sadari nanti.
Rezuan