(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 externosfindsubstituí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 matrizreplytransforma a correspondência em uma lista de nomes. -
$REPLY\#é a visualização de diretório do arquivo. -
$REPLY\#/**/*vacation*.jpgcorresponde a*vacation*.jpgficheiros no arquivo. - O qualificador
Nglob faz com que o padrão seja expandido para uma lista vazia se não houver correspondência.