ฉันจะ 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
ฯลฯ ...