ฉันจะ grep สำหรับสตริงวนซ้ำผ่าน.gzไฟล์ทั้งหมดในทุกไดเรกทอรีและไดเรกทอรีย่อยได้อย่างไร
ฉันจะ grep สำหรับสตริงวนซ้ำผ่าน.gzไฟล์ทั้งหมดในทุกไดเรกทอรีและไดเรกทอรีย่อยได้อย่างไร
คำตอบ:
@Steve Weet ใกล้จะถึงแล้ว การใช้ / dev / null เป็นอาร์กิวเมนต์เพิ่มเติมเป็นวิธีที่ดีในการบังคับให้แสดงชื่อไฟล์ (ฉันจะจำได้ว่าขอบคุณ Steve) แต่ก็ยังใช้งาน exec สำหรับไฟล์ทุกไฟล์ที่พบ - ค่าใช้จ่ายมาก
คุณต้องการรัน zgrep สองสามครั้งเท่าที่จะทำได้เพื่อให้ได้ประโยชน์สูงสุดจากการดำเนินการแต่ละครั้ง:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargsจะจัดหา args (ชื่อไฟล์) ให้มากที่สุดเท่าที่จะทำได้เพื่อ zgrep และดำเนินการซ้ำ ๆ จนกว่าจะได้ใช้ไฟล์ทั้งหมดที่จัดทำโดยfindคำสั่ง การใช้-print0และ-0ตัวเลือกช่วยให้มันทำงานได้หากมีช่องว่างในชื่อไฟล์หรือไดเรกทอรี
บน Mac OS X คุณสามารถได้รับเอฟเฟกต์เดียวกันโดยไม่ต้อง xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-Hเพื่อแสดงชื่อไฟล์ด้วยบรรทัดที่ตรงกันเสมอใน GNU grep อย่างน้อย
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
ดังนั้นสิ่งที่ชอบ
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -rผ่านต้นไม้หรือหาก -r ไม่ทำงานให้ส่งออกข้อมูลการค้นหาผ่านxargs zgrep
/bin/zgrep: -r: option not supportedใช้ระบบ Ubuntu ที่เพิ่งติดตั้งใหม่
xargsแทนแล้ว
@aioobe ใกล้จะถึงแล้ว คำสั่งจะทำงาน แต่จะไม่บอกชื่อไฟล์ให้คุณทราบ
ต่อไปนี้ควรบอกชื่อไฟล์ด้วย:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
การเพิ่ม/dev/nullจะทำให้แน่ใจว่า zgrep เห็นชื่อไฟล์สองไฟล์ดังนั้นมันจะแสดงชื่อของไฟล์ให้คุณหากพบว่าเป็นสตริง
แก้ไข
การวิจัยเพิ่มเติมพบว่าสำหรับเครื่องของฉัน (OS / X) -execข้อโต้แย้งในการค้นหาจะเพิ่มชื่อไฟล์ให้มากที่สุดเท่าที่จะเป็นไปได้ (คล้ายกับวิธีการxargsทำงาน)
-exec- ฉันทุกคนเกี่ยวกับการพกพาดังนั้นฉันจะไม่ใช้มันในสคริปต์ แต่ยอดเยี่ยมสำหรับพรอมต์คำสั่ง
findแต่ส่วนใหญ่เป็นรุ่นที่ทันสมัย (เช่นใน Distros ที่ใช้ Debian)
-Hเพื่อแสดงชื่อไฟล์ที่มีบรรทัดที่ตรงกันเสมอใน GNU grep อย่างน้อยแทนที่จะเป็น/dev/nullแฮ็ค
งานดังต่อไปนี้ได้รับการปฏิบัติ zsh
for archive in **/*.gz; do
echo "[${archive}] "
gzip -dc ${archive} | grep -n "String"
done
นอกจากนี้ยังอาจทำงานในbash, kshฯลฯ ...