Tüm sıkıştırılmış dosyaları bulma ve arama


9

Sabit diskimi zip, gzip, bzip ve diğerleri gibi tüm sıkıştırılmış dosya koleksiyonları için taramak ve belirli dosya türlerini (resimler gibi) arayanların içeriğine sahip olmak istiyorum. Anti-virüs 'bunu yapıyorum, bu yüzden bir yol olması gerektiğine inanıyorum.


@Rinzwind, dosyalar listesinde değil, arşiv dosyalarında arama yapar. İçerir fooama içerir dosyaları bulur foo.png.
terdon

Bu bir Zip Bombası olup olmadığını kontrol etmekte yardımcı olabilir! +1
Sharad Gautam

Yanıtlar:


17

En basit yaklaşım, arşivin içeriğini listelemek ve ilgili uzantının dosyalarını aramak olacaktır. Örneğin, bir zipdosyayla:

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

-sfSeçenek söyler ziplistesine bir arşivde yer alan dosyalar. Ardından, satırın sonunda bulunan grepbir .pngveya işaretini arar .jpg( $). -EKullandığımız böylece, normal ifadeler genişletilmiş sağlayan |OR olarak ve -ieşleştirme vaka duyarsız hale getirir.

Ancak, her arşiv aracının içeriği listelemek için farklı bir komutu vardır. En popüler olanların çoğuyla başa çıkabilen bir senaryo yazdım . Bu komut dosyasını olarak kaydederseniz list_compressed.sh, şunları çalıştırabilirsiniz:

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

Bu size en yaygın resim türlerini gösterir. Bu yaklaşımın dosya türünün dosyanın uzantısı tarafından belirlenebileceğini varsaydığını unutmayın. Uzantısı olmayan resim dosyalarını bulamaz ve yanlış uzantıya sahip dosyaları tanımaz. Dosyaları arşivden çıkarmadan ve fileher birinde çalıştırmadan bununla başa çıkmanın bir yolu yoktur .


Sabit sürücünüzde görüntü dosyaları içeren tüm arşivleri bulmak istiyorsanız , aşağıdakileri birleştirin 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

Bulmak komutu tüm arayacaktır .gz, .tgzya .zipo sonra benim komut geçirilir, dosyaları (istediğiniz gibi birçok uzantıları olarak ekleyebilirsiniz). -qNormal çıkışı var grep bastırır, hiçbir şey yazdırılır. && echoYalnızca Arşivin adını yazdırır grepbaşarılı oldu.


Orijinal soruma göre "sabit diskimi zip gibi sıkıştırılmış dosya koleksiyonları için resim içeren taramak" istiyorum. Arşivlerin kendilerine bakmanıza yardımcı oldunuz, ancak sadece hangi arşivlerin görüntü içerdiğini tanımlamak istiyorum.
6ft Dan

Üzgünüm, orijinali görmemiştim. Lütfen yayınınızın anlamını değiştiren tüm düzenlemeleri geri almaktan veya yeniden düzenlemekten çekinmeyin. Tüm dosya sisteminde nasıl arama yapılacağı ile ilgili güncellenmiş cevaba bakınız.
terdon

Harika, ama büyük / küçük harfe duyarsız bir şekilde selamladığınız için, büyük / küçük harfe duyarlı olmayan bir şekilde de arama yapmak istersiniz?
kos

hmm @kos, bu sadece bir değişiklik yapmak kolay yeter -nameetmek -iname. Bununla birlikte, bunun pek bir anlamı yoktur, birçok sıkıştırma programının (örneğin, gzip) belirli bir uzantıya ihtiyacı vardır. GZçalışmaz.
terdon

3

Terdon kadar gelişmiş değil, ama bu yapacak:

Aşağıdaki kodu, tüm kodlarınızın bulunduğu bir klasöre finda.sh, istediğiniz gibi veya istediğiniz başka bir adla kaydedin :

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

Sonra bir dir tüm arşivleri vardı, çalıştırın ve bu çıktı:

./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

Orijinal soruma göre "sabit diskimi zip gibi sıkıştırılmış dosya koleksiyonları için resim içeren taramak" istiyorum. Arşivlerin kendilerine bakmanıza yardımcı oldunuz, ancak sadece hangi arşivlerin görüntü içerdiğini tanımlamak istiyorum.
6ft Dan

@ 6ftDan Bu, bence mümkün, ama biraz zaman alabilir. Bu arada, senaryomda terdon yardımı ile bazı iyileştirmeler ekledim.
blade19899

*.*Yalnızca uzantısı olan dosyalarla eşleşeceğini unutmayın . Ayrıca, bu tüm arşivlerdeki tüm dosyaları listeleyecektir , herhangi bir dosya türü için test yapmıyorsunuz.
terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.