Znajdź i przeszukaj wszystkie skompresowane pliki

9

Chciałbym przeskanować dysk twardy w poszukiwaniu wszystkich skompresowanych kolekcji plików, takich jak zip, gzip, bzip i inne, i mieć zawartość tych, które są wyszukiwane dla określonych typów plików (takich jak obrazy). Zrób to antywirusowo, więc uważam, że powinien istnieć sposób.

6 stóp Dan
źródło
@ Rinzwind, który będzie wyszukiwał w plikach archiwum, a nie na liście plików. Znajdzie pliki zawierające, fooale nie foo.png.
terdon
Może to być pomocne w poszukiwaniu Zip Zip! +1
Sharad Gautam

Odpowiedzi:

17

Najprostszym podejściem byłoby wylistowanie zawartości archiwum i poszukiwanie plików odpowiedniego rozszerzenia. Na przykład z zipplikiem:

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

-sfOpcja mówi zipdo listy plików znajdujących się w archiwum. Następnie grepszuka a .pnglub .jpgktóre znajdują się na końcu linii ( $). -EUmożliwia rozszerzone wyrażenia regularne, więc możemy użyć |jako lub i -isprawia, że dopasowanie nie uwzględnia wielkości liter.

Jednak każde narzędzie do archiwizacji ma inne polecenie do wyświetlenia zawartości. Napisałem skrypt, który poradzi sobie z większością popularnych. Jeśli zapiszesz ten skrypt jako list_compressed.sh, możesz uruchomić:

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

To pokazuje najpopularniejsze typy obrazów. Zauważ, że takie podejście zakłada, że ​​typ pliku może być określony przez rozszerzenie pliku. Nie znajdzie plików obrazów, które nie mają rozszerzenia, i nie rozpozna plików z niewłaściwym rozszerzeniem. Nie ma sposobu, aby sobie z tym poradzić bez wyodrębnienia plików z archiwum i uruchomienia filena każdym z nich.


Jeśli chcesz znaleźć wszystkie archiwa zawierające pliki obrazów na dysku twardym, połącz powyższe z 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

Polecenie find wyszuka wszystkie .gz, .tgzlub .zippliki (można dodać dowolną liczbę rozszerzeń, jak chcesz), te są następnie przekazywane za pośrednictwem mojego skryptu. W -qPomija grep normalne wyjście, nic nie zostanie wydrukowany. Wyświetli && echonazwę archiwum tylko wtedy, gdy się greppowiedzie.

terdon
źródło
Zgodnie z moim pierwotnym pytaniem chciałbym „przeskanować dysk twardy w poszukiwaniu wszystkich skompresowanych kolekcji plików, takich jak zip, które zawierają obrazy”. Pomogłeś w przeszukiwaniu samych archiwów, ale chcę tylko określić, które archiwa zawierają obrazy.
6 stóp Dan
@ 6ftDan przepraszam, nie widziałem oryginału. Cofnij lub ponownie edytuj każdą zmianę, która zmienia znaczenie Twojego postu. Zobacz zaktualizowaną odpowiedź dotyczącą wyszukiwania całego systemu plików.
terdon
Świetnie, ale skoro przeszukujesz wielkość liter bez rozróżniania wielkości liter, może chcesz także wyszukiwać bez rozróżniania wielkości liter?
Kos
@kos hmm, to jest dość łatwe do zrobienia po prostu zmienić -namena -iname. Jednak nie ma to większego sensu, wiele programów kompresujących (na przykład gzip) potrzebuje określonego rozszerzenia. GZnie zadziała.
terdon
3

Nie tak zaawansowany jak terdon, ale spowoduje to:

Zapisz następujący kod w folderze, w którym znajduje się cały kod, as finda.shlub dowolna inna nazwa:

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

Następnie w katalogu, w którym znajdują się wszystkie twoje archiwa, uruchom je, a to jest wynik:

./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
źródło
Zgodnie z moim pierwotnym pytaniem chciałbym „przeskanować dysk twardy w poszukiwaniu wszystkich skompresowanych kolekcji plików, takich jak zip, które zawierają obrazy”. Pomogłeś w przeszukiwaniu samych archiwów, ale chcę tylko określić, które archiwa zawierają obrazy.
6 stóp Dan
@ 6ftDan Myślę, że to możliwe, ale może chwilę potrwać. W międzyczasie dodałem kilka ulepszeń do mojego skryptu, przy pomocy terdona.
blade19899
Pamiętaj, że *.*będą pasować tylko pliki z rozszerzeniem. Spowoduje to również wyświetlenie listy wszystkich plików we wszystkich archiwach, nie testujesz żadnego typu pliku.
terdon