Temukan dan cari di dalam semua file terkompresi

10

Saya ingin memindai hard drive saya untuk semua koleksi file terkompresi seperti zip, gzip, bzip, dan lainnya dan memiliki konten yang dicari untuk jenis file tertentu (seperti gambar). Anti-virus lakukan, jadi saya percaya harus ada jalan.

6ft Dan
sumber
@Rinzwind yang akan mencari di dalam file arsip, bukan di dalam daftar file. Ini akan menemukan file yang berisi footetapi tidak foo.png.
terdon
Ini mungkin berguna untuk memeriksa Bom Zip! +1
Sharad Gautam

Jawaban:

18

Pendekatan yang paling sederhana adalah dengan mendaftar isi arsip dan mencari file dari ekstensi yang relevan. Misalnya, dengan zipfile:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

The -sfpilihan memberitahu zipke dalam daftar file yang terdapat dalam arsip. Kemudian, grepakan mencari .pngatau .jpgyang ada di akhir baris ( $). The -Ememungkinkan diperpanjang ekspresi reguler, sehingga kita dapat menggunakan |sebagai OR dan -imembuat kasus pencocokan tidak sensitif.

Namun, setiap alat arsip memiliki perintah berbeda untuk membuat daftar konten. Saya telah menulis sebuah skrip yang dapat menangani sebagian besar yang lebih populer. Jika Anda menyimpan skrip itu sebagai list_compressed.sh, Anda dapat menjalankan:

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

Itu akan menunjukkan kepada Anda tipe gambar yang paling umum. Perhatikan bahwa pendekatan ini mengasumsikan bahwa tipe file dapat ditentukan oleh ekstensi file. Itu tidak akan menemukan file gambar yang tidak memiliki ekstensi dan itu tidak akan mengenali file dengan ekstensi yang salah. Tidak ada cara untuk mengatasinya tanpa benar-benar mengekstraksi file dari arsip dan menjalankannya filemasing-masing.


Jika Anda ingin menemukan semua arsip yang berisi file gambar di hard drive Anda, gabungkan yang di atas dengan 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

Perintah find akan mencari semua .gz, .tgzatau .zipfile (Anda dapat menambahkan ekstensi sebanyak yang Anda suka), yang kemudian melewati skrip saya. The -qMenekan grep output normal, tidak ada yang akan dicetak. The && echoakan mencetak nama arsip hanya jika grepberhasil.

terdon
sumber
Menurut pertanyaan awal saya, saya ingin "memindai hard drive saya untuk semua koleksi file terkompresi, seperti zip, yang berisi gambar". Anda telah membantu untuk melihat arsip itu sendiri, tetapi saya hanya ingin mengidentifikasi arsip mana yang berisi gambar.
6ft Dan
@ 6ftDan maaf, saya belum melihat yang asli. Silakan memutar kembali atau mengedit kembali suntingan yang mengubah arti posting Anda. Lihat jawaban yang diperbarui untuk cara mencari seluruh sistem file.
terdon
Bagus, tetapi karena Anda memahami case-insensitive mungkin Anda ingin juga mencari case-insensitive?
kos
@kos hmm, itu cukup mudah untuk melakukan perubahan hanya -nameuntuk -iname. Namun, ada sedikit gunanya, banyak program kompresi (gzip, misalnya) membutuhkan ekstensi spesifik. GZtidak akan bekerja
terdon
3

Tidak semaju terdon, tetapi ini akan berhasil:

Simpan kode berikut, dalam folder tempat semua kode Anda berada, seperti finda.sh, atau nama lain yang Anda inginkan:

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

Kemudian dalam direktori semua arsip Anda berada, jalankan dan inilah hasilnya:

./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
blade19899
sumber
Menurut pertanyaan awal saya, saya ingin "memindai hard drive saya untuk semua koleksi file terkompresi, seperti zip, yang berisi gambar". Anda telah membantu untuk melihat arsip itu sendiri, tetapi saya hanya ingin mengidentifikasi arsip mana yang berisi gambar.
6ft Dan
@ 6ftDan Itu, saya pikir itu mungkin, tetapi mungkin perlu waktu. Sementara itu, saya menambahkan beberapa perbaikan pada skrip saya, sedikit pun bantuan terdon.
blade19899
Perhatikan bahwa *.*hanya akan mencocokkan file dengan ekstensi. Selain itu, ini akan mencantumkan semua file di semua arsip, Anda tidak menguji untuk jenis file apa pun.
terdon