ฉันจะพิมพ์เนื้อหาแทนชื่อไฟล์โดยใช้คำสั่ง 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นั้นเป็นเหตุผลที่ต้องการใช้findแทนcatคำสั่ง


catคุณยังคงต้องใช้
Ignacio Vazquez-Abrams

ใช่ คุณช่วยบอกฉันทีว่าฉันจะทำอย่างนั้นได้อย่างไร @ IgnacioVazquez-Abrams
Rezuan

คำตอบ:


28

findยูทิลิตี้เกี่ยวข้องกับ pathnames หากไม่มีการพูดถึงการกระทำที่เฉพาะเจาะจงในfindคำสั่งสำหรับชื่อพา ธ ที่พบการดำเนินการเริ่มต้นคือการส่งออกพวกเขา

คุณอาจจะดำเนินการดำเนินการเกี่ยวกับ pathnames พบเช่นทำงาน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เอาท์พุทจะไป

ที่เกี่ยวข้อง:


1
ทำงานตามที่คาดไว้และเวลาดำเนินการเป็นไปอย่างรวดเร็วซึ่งเยี่ยมยอดมาก ขอบคุณมาก.
Rezuan

12

ผลลัพธ์ของ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

4
คำสั่งของคุณทั้งสองทำงานได้ดี แต่ช้ากว่าคำสั่งของ Kusalanandaเล็กน้อย ฉันเดาเวลาดำเนินการจะแตกต่างกันบนและ-exec cat {} \; -exec -cat {} +ขอบคุณมาก Yaron
Rezuan

xargs มีช่องโหว่ในชื่อพา ธ ที่พบ -exec cat {} ไม่ใช่
jez

2
find -print0 | xargs -0ไม่เสี่ยงต่อช่องว่าง / เครื่องหมายคำพูด / ฯลฯ
ปุย

1
@Rezuan: -exec cat {} \;เรียกใช้ cat แยกกันสำหรับแต่ละไฟล์แทนที่จะเป็น batching ร่วมกันเช่น xargs ไม่ได้ใช้มันถ้าคุณต้องการที่ (เช่นคำสั่งที่ใช้งานได้เพียงหนึ่งไฟล์ในเวลา) อย่างชัดเจนหรือถ้าคุณต้องการพกพาไปยังระบบได้โดยไม่ต้อง-exec ... +และไม่มี/-print0 xargs -0ฉันประหลาดใจเล็กน้อยว่าfind|xargsเป็นวัดช้ากว่า-exec cat {} +แต่ คุณมีไฟล์รวมน้อยมากดังนั้นค่าใช้จ่ายในการเริ่มต้นจึงมีค่าใช้จ่ายมาก หรือคุณเพียงแค่เวลาที่xargsรุ่นในขณะที่ดิสก์แคชของคุณเย็น
Peter Cordes

1
@ PeterCordes ขอบคุณสำหรับคำอธิบาย มันเป็นแคชของดิสก์ที่ฉันรู้ในภายหลัง
Rezuan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.