(Adaptado de Como faço recursivamente grep através de arquivos compactados? )
Instale o AVFS , um sistema de arquivos que fornece acesso transparente dentro dos arquivos. Primeiro, execute este comando uma vez para configurar uma visualização do sistema de arquivos de sua máquina, no qual você pode acessar os arquivos como se fossem diretórios:
mountavfs
Depois disso, se /path/to/archive.zip
for um arquivo reconhecido, então ~/.avfs/path/to/archive.zip#
é um diretório que parece conter o conteúdo do arquivo.
find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*vacation*.jpg"
' {} 'Test::Version' \;
Explicações:
- Monte o sistema de arquivos AVFS.
- Procure por arquivos archive em
~/.avfs$PWD
, que é a visualização do AVFS do diretório atual. - Para cada arquivo, execute o fragmento de shell especificado (com
$0
= nome do arquivo e$1
= padrão a ser pesquisado). -
$0#
é a visualização de diretório do arquivo$0
. -
{\}
em vez de{}
é necessário no caso dos argumentos externosfind
substituírem{}
dentro de-exec ;
(alguns fazem isso, outros não).
Ou em zsh ≥4.3:
mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')
Explicações:
-
~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)
corresponde a arquivos na visualização do AVFS do diretório atual e de seus subdiretórios. -
PATTERN(e\''CODE'\')
aplica CODE a cada correspondência de PATTERN. O nome do arquivo correspondente está em$REPLY
. A configuração da matrizreply
transforma a correspondência em uma lista de nomes. -
$REPLY\#
é a visualização de diretório do arquivo. -
$REPLY\#/**/*vacation*.jpg
corresponde a*vacation*.jpg
ficheiros no arquivo. - O qualificador
N
glob faz com que o padrão seja expandido para uma lista vazia se não houver correspondência.