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.


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.