libarchive
's bsdtar
สามารถจัดการกับที่สุดของรูปแบบไฟล์เหล่านั้นเพื่อให้คุณสามารถทำ:
find . \( -name '*.zip' -o \
-name '*.tar' -o \
-name '*.tar.gz' -o \
-name '*.tar.bz2' -o \
-name '*.tar.xz' -o \
-name '*.tgz' -o \
-name '*.tbz2' -o \
-name '*.7z' -o \
-name '*.iso' -o \
-name '*.cpio' -o \
-name '*.a' -o \
-name '*.ar' \) \
-type f \
-exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null
ซึ่งคุณสามารถลดความซับซ้อน (และปรับปรุงเพื่อให้ตรงตามตัวพิมพ์ใหญ่ - เล็ก) กับ GNU find
ด้วย:
find . -regextype egrep \
-iregex '.*\.(zip|7z|iso|cpio|ar?|tar(|\.[gx]z|\.bz2)|tgz|tbz2)' \
-type f \
-exec bsdtar tf {} '*vacation*jpg' \; 2> /dev/null
ไม่พิมพ์เส้นทางของไฟล์เก็บถาวรที่*vacation*jpg
พบไฟล์เหล่านั้น หากต้องการพิมพ์ชื่อนั้นคุณสามารถแทนที่บรรทัดสุดท้ายด้วย:
-exec sh -ac '
for ARCHIVE do
bsdtar tf "$ARCHIVE" "*vacation*jpg" |
awk '\''{print ENVIRON["ARCHIVE"] ": " $0}'\''
done' sh {} + 2> /dev/null
ซึ่งให้ผลลัพธ์เช่น:
./a.zip: foo/blah_vacation.jpg
./a.zip: bar/blih_vacation.jpg
./a.tar.gz: foo/blah_vacation.jpg
./a.tar.gz: bar/blih_vacation.jpg
หรือด้วยzsh
:
setopt extendedglob # best in ~/.zshrc
for archive (**/*.(#i)(zip|7z|iso|cpio|a|ar|tar(|.gz|.xz|.bz2)|tgz|tbz2)(.ND)) {
matches=("${(f@)$(bsdtar tf $archive '*vacation*jpg' 2> /dev/null)"})
(($#matches)) && printf '%s\n' "$archive: "$^matches
}
โปรดทราบว่ามีหลายรูปแบบไฟล์อื่น ๆ ที่เป็นเพียงzip
หรือtgz
ไฟล์ที่ปลอมตัวเหมือน.jar
หรือ.docx
ไฟล์ คุณสามารถเพิ่มสิ่งเหล่านั้นในfind
/ zsh
รูปแบบการค้นหาของคุณbsdtar
ไม่สนใจเกี่ยวกับส่วนขยาย (เช่นในมันไม่พึ่งพาส่วนขยายในการกำหนดประเภทของไฟล์)
โปรดทราบว่า*vacation*.jpg
ด้านบนถูกจับคู่บนพา ธ สมาชิกไฟล์เก็บถาวรแบบเต็มไม่เพียง แต่ชื่อไฟล์ดังนั้นมันจะจับคู่vacation.jpg
แต่เปิดvacation/2014/file.jpg
ด้วย
เพื่อให้ตรงกับชื่อไฟล์เท่านั้นเคล็ดลับอย่างหนึ่งคือการใช้โหมดแยกใช้-s
(ทดแทน) ซึ่งใช้ regexps พร้อมกับp
ตั้งค่าสถานะเพื่อพิมพ์ชื่อของไฟล์ที่ตรงกันแล้วตรวจสอบให้แน่ใจว่าไม่มีการแตกไฟล์เช่น:
bsdtar -'s|.*vacation[^/]*$||' -'s|.*||' -xf "$archive"
โปรดทราบว่ามันจะส่งออกรายการใน stderr และผนวก>>
กับทุกบรรทัด ไม่ว่าในกรณีใด ๆbsdtar
เช่นtar
การใช้งานส่วนใหญ่อาจทำให้ชื่อไฟล์บนจอแสดงผลยุ่งเหยิงหากมีอักขระบางตัวเช่นขึ้นบรรทัดใหม่หรือแบ็กสแลช (แสดงผลเป็น\n
หรือ\\
)