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.
fooale niefoo.png.