Se a sua variante unix suporta FUSE (Linux, * BSD, OSX, todos do Solaris), monte AVFS para acessar arquivos de forma transparente. O comando mountavfs
cria uma visualização de todo o sistema de arquivos, com raiz em ~/.avfs
, em que os arquivos archive possuem um diretório associado que contém os diretórios e arquivos no archive. Por exemplo, se você tiver foo.zip
no diretório atual, o comando a seguir será equivalente a unzip -l foo.zip
:
mountavfs # needs to be done once and for all
find ~/.avfs$PWD/foo.zip\# -ls
Portanto, faça o loop de todas as imagens contidas em um arquivo zip no diretório atual e copie-as para /destination/directory
(com um prompt em caso de conflito):
find ~/.avfs"$PWD" -name '*.zip' -exec sh -c '
find "${0}#" -name "*.jpg" -exec cp -ip {} "$1" \;
' {} /destination/directory \;
No zsh:
cp -ip ~/.avfs$PWD/**/*.zip(e\''REPLY=($REPLY\#/**/*.jpg(N))'\') /destination/directory
Desconstrução: ~/.avfs$PWD/**/*.zip
expande para a exibição do AVFS dos arquivos zip no diretório atual. O qualificador glob e
é usado para modificar a saída do glob: …/*.zip(e\''REPLY=$REPLY\#'\')
apenas acrescentaria um #
a cada correspondência. REPLY=($REPLY\#/**/*.jpg(N))
transforma cada correspondência na matriz de .jpg
arquivos no diretório .zip#
.