แสดงเนื้อหาของไฟล์จำนวนมาก


19

จากบรรทัดคำสั่งวิธีที่ง่ายที่สุดในการแสดงเนื้อหาของไฟล์หลายไฟล์คืออะไร? ไดเรกทอรีของฉันดูเหมือนว่าด้านล่าง

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

.htaccessตอนนี้ผมอยากจะดูเนื้อหาของไฟล์ทั้งหมดยกเว้น อาจมีลักษณะเช่น:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

ฉันคิดว่าสิ่งนี้ควรจะทำได้ด้วยการผสมผสานระหว่างการหาค่า xargs และ cat แต่ฉันไม่ได้หาวิธี ขอบคุณที่สละเวลา!


คำตอบ:


30

คำสั่งมาตรฐานสองคำสั่งheadและtailพิมพ์ส่วนหัวด้วยชื่อไฟล์หากคุณส่งอาร์กิวเมนต์มากกว่าหนึ่งไฟล์ หากต้องการพิมพ์ไฟล์ทั้งหมดให้ใช้tail -n +1(พิมพ์จากบรรทัดแรกเป็นต้นไปเช่นทุกอย่าง)

ที่นี่ดูเหมือนว่าคุณต้องการเห็นทุกไฟล์ยกเว้นไฟล์เดียวที่มีชื่อขึ้นต้นด้วยจุด ไฟล์ดอทจะ“ ซ่อนอยู่” ภายใต้ยูนิกซ์: ไฟล์เหล่านั้นจะไม่ปรากฏในเอาท์พุทเริ่มต้นของlsหรือในรายการจับคู่ *ดังนั้นการจับคู่ทุกไฟล์ที่ไม่ซ่อนจะทำมีเพียง

tail -n +1 *

( tail -n +1 -- *จำเป็นต้องพูดอย่างเคร่งครัดในกรณีที่ชื่อไฟล์หนึ่งชื่อขึ้นต้นด้วย a -)


สั้นและหวานขอขอบคุณ! คุณรู้หรือไม่ว่าฉันสามารถอ่านเกี่ยวกับ--ตัวแก้ไขได้ที่ไหน
Znarkus

2
@Znarkus: --เพื่อบ่งบอกถึงจุดสิ้นสุดของตัวเลือกเป็นแบบแผนที่คำสั่งส่วนใหญ่เชื่อฟัง เช่นtail -n +1 -- -f -gบอกtailว่า-fและ-gเป็นไฟล์ที่จะอ่าน (ตัวถูกดำเนินการ) และไม่ใช่ตัวเลือก มันเป็นแนวทางที่ 10 ในแนวทางไวยากรณ์ของยูทิลิตี้ POSIX (เอกสารสำหรับนักเขียนยูทิลิตี้) ฉันไม่มีคำแนะนำในการอ่านสำหรับผู้ใช้ปลายทางฉันคาดหวังว่าการสอนยูนิกซ์ที่ดีจะครอบคลุมในบางจุด
Gilles 'หยุดชั่วร้าย'

เพียงแค่คำพูดเพราะคำตอบอื่น ๆ อีกมากมายเสนอให้ใช้findแต่แล้วใช้ exec บางคนที่มีการจัดรูปแบบการพิมพ์: วิธีที่ง่ายต่อการใช้findและtailเป็น: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0และxargs -0และ--ให้มั่นใจว่าคำสั่งยังทำงานร่วมกับชื่อไฟล์ที่มีช่องว่างหรือเริ่มต้นด้วย -)
IanH

14

คุณสามารถทำได้ทั้งหมดในที่เดียวด้วยfind:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

ที่บอกfindให้ค้นหาไฟล์ทั้งหมด ( -type f) ในไดเรกทอรีปัจจุบัน ( .) ยกเว้น ( -not) หนึ่งชื่อ.htaccess( -name .htaccess) จากนั้นก็จะพิมพ์ ( -printf) ขึ้นบรรทัดใหม่ตามด้วยชื่อไฟล์ ( %p) และจากนั้นก็วิ่งcatบนแฟ้ม ( -exec cat {} \;) ที่จะให้ผลลัพธ์เช่น:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

หากคุณทำเช่นนี้บ่อยครั้งมันอาจคุ้มค่าที่จะใช้มันในเชลล์สคริปต์หรือฟังก์ชั่น ฉันมีหนึ่งชื่อcatsที่ทำอย่างนั้น:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

มันวนรอบอาร์กิวเมนต์ของชื่อไฟล์แต่ละไฟล์พิมพ์ชื่อไฟล์ (เป็นตัวหนาสีเขียว) จากนั้นให้แมวไฟล์:

ภาพตัวอย่าง

ดังนั้นคำสั่งก็จะเป็น:

$ find . -type f -not -name .htaccess -exec cats {} \+

อีกอันสั้นกว่าจึงยอมรับได้ว่า คำตอบที่ดีแม้ว่าขอบคุณ!
Znarkus

6

หากต้องการแสดงเนื้อหาของไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบันให้ลอง:

grep -vI "\x00" -- *

และคล้ายกัน แต่ซ้ำ:

grep -vIr "\x00" -- .

รูปแบบจะเป็น: filename: content.

หากต้องการรูปแบบที่คล้ายกันตามที่แนะนำไว้จะเป็น:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

หมายเหตุด้านข้าง:

  • การใช้ NUL ( \x00) ในตัวอย่างด้านบนป้องกันการแสดงไฟล์ไบนารี่ (ซึ่ง-Iกำลังทำอยู่ แต่เรายังคงใช้รูปแบบบางอย่าง)
  • โดยใช้ตัวแทน ( *ไฟล์) .htaccessมันจะละเว้นซ่อนอยู่เช่น

ดูเพิ่มเติมที่: grep: แสดงชื่อไฟล์หนึ่งครั้งจากนั้นแสดงบริบทที่มีหมายเลขบรรทัดที่ Unix SE


2
มักgrep -r ^จะเพียงพอ
catpnosis


1

หากคุณต้องการปรับแต่งและไม่เสียเวลาไปกับการค้นหาท่อและทุกอย่าง (เป็นเครื่องมือที่ทรงพลังที่สุดเท่าที่คุณจะหาได้)

แค่ลองใช้ for-loop, cat ฯลฯ


0

หากคุณต้องการพิมพ์ด้วยซ้ำก็ใช้ซ้ำ (เช่นไฟล์ที่มีนามสกุล. sql เป็นต้น):

find -name "*.sql" -exec cat {} \; > all.sql
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.