ฉันต้องการสแกนฮาร์ดไดรฟ์ของฉันสำหรับคอลเลกชันไฟล์บีบอัดทั้งหมดเช่น zip, gzip, bzip และอื่น ๆ และมีเนื้อหาของไฟล์ที่ค้นหาไฟล์บางประเภท (เช่นรูปภาพ) ป้องกันไวรัสทำมันดังนั้นผมเชื่อว่าควรจะมีวิธี
ฉันต้องการสแกนฮาร์ดไดรฟ์ของฉันสำหรับคอลเลกชันไฟล์บีบอัดทั้งหมดเช่น zip, gzip, bzip และอื่น ๆ และมีเนื้อหาของไฟล์ที่ค้นหาไฟล์บางประเภท (เช่นรูปภาพ) ป้องกันไวรัสทำมันดังนั้นผมเชื่อว่าควรจะมีวิธี
คำตอบ:
วิธีที่ง่ายที่สุดคือการแสดงรายการเนื้อหาของไฟล์เก็บถาวรและค้นหาไฟล์ของส่วนขยายที่เกี่ยวข้อง ตัวอย่างเช่นกับzip
ไฟล์:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
-sf
ตัวเลือกที่บอกzip
ไปยังรายการไฟล์ที่มีอยู่ในที่เก็บ จากนั้นgrep
จะค้นหา.png
หรือ.jpg
ที่อยู่ท้ายบรรทัด ( $
) -E
ช่วยให้การแสดงออกปกติขยายเพื่อให้เราสามารถใช้|
เป็นหรือและ-i
ทำให้ตายกรณีการจับคู่
อย่างไรก็ตามเครื่องมือเก็บถาวรแต่ละอันมีคำสั่งต่างกันในการแสดงเนื้อหา ฉันได้เขียนสคริปต์ที่สามารถจัดการกับสคริปต์ที่ได้รับความนิยมมากที่สุด หากคุณบันทึกสคริปต์นั้นเป็นlist_compressed.sh
คุณสามารถเรียกใช้:
list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'
ที่จะแสดงให้คุณมากที่สุดประเภทภาพทั่วไป โปรดทราบว่าวิธีการนี้ถือว่าประเภทไฟล์สามารถกำหนดได้โดยส่วนขยายของไฟล์ จะไม่พบไฟล์รูปภาพที่ไม่มีนามสกุลและจะไม่รู้จักไฟล์ที่มีนามสกุลไม่ถูกต้อง ไม่มีวิธีจัดการกับสิ่งนั้นโดยไม่ต้องแตกไฟล์ออกจากไฟล์เก็บถาวรและเรียกใช้file
ในแต่ละไฟล์
หากคุณต้องการค้นหาไฟล์เก็บถาวรทั้งหมดที่มีไฟล์ภาพในฮาร์ดไดรฟ์ของคุณให้รวมข้างต้นด้วยfind
:
find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
while IFS= read -r -d '' arch; do
list_compressed.sh "$arch" |
grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
echo "$arch contains image(s)"
done
หาคำสั่งจะค้นหาทั้งหมด.gz
, .tgz
หรือ.zip
ไฟล์ (คุณสามารถเพิ่มส่วนขยายให้มากที่สุดเท่าที่คุณต้องการ) ผู้ที่จะผ่านไปแล้วผ่านสคริปต์ของฉัน -q
ไม่ใส่ grep เป็นออกตามปกติไม่มีอะไรจะพิมพ์ && echo
จะพิมพ์ชื่อที่เก็บของเฉพาะในกรณีที่grep
ประสบความสำเร็จ
-name
-iname
อย่างไรก็ตามมีจุดเล็ก ๆ น้อย ๆ เช่นโปรแกรมบีบอัดหลายตัว (gzip เป็นต้น) ต้องการส่วนขยายที่เฉพาะเจาะจง GZ
จะไม่ทำงาน
ไม่สูงเท่าเทอร์ดอน แต่จะทำเช่นนี้:
บันทึกรหัสต่อไปนี้ในโฟลเดอร์ที่ทุกอยู่ของคุณรหัสในขณะที่finda.sh
หรือชื่ออื่นใดตามที่คุณชอบ:
for file in *.*; do
if ( 7z l -slt "$file"> /tmp/$file.log); then
echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
fi
done
จากนั้นในเอกสารทั้งหมดของคุณจะอยู่ในนั้นให้รันและนี่คือผลลัพธ์:
./finda.sh
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png
*.*
จะจับคู่ไฟล์ที่มีนามสกุลเท่านั้น นอกจากนี้จะแสดงรายการไฟล์ทั้งหมดในไฟล์เก็บถาวรทั้งหมดคุณไม่ได้ทดสอบไฟล์ทุกประเภท
foo
foo.png