Najprostszym podejściem byłoby wylistowanie zawartości archiwum i poszukiwanie plików odpowiedniego rozszerzenia. Na przykład z zip
plikiem:
$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
file1.jpg
file1.png
file2.jpg
file2.png
-sf
Opcja mówi zip
do listy plików znajdujących się w archiwum. Następnie grep
szuka a .png
lub .jpg
które znajdują się na końcu linii ( $
). -E
Umożliwia rozszerzone wyrażenia regularne, więc możemy użyć |
jako lub i -i
sprawia, ż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 file
na 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
, .tgz
lub .zip
pliki (można dodać dowolną liczbę rozszerzeń, jak chcesz), te są następnie przekazywane za pośrednictwem mojego skryptu. W -q
Pomija grep normalne wyjście, nic nie zostanie wydrukowany. Wyświetli && echo
nazwę archiwum tylko wtedy, gdy się grep
powiedzie.
foo
ale niefoo.png
.