Encontre recursivamente todos os arquivos de diversos formatos e pesquise-os por padrões de nomes de arquivos

Encontre recursivamente todos os arquivos de diversos formatos e pesquise-os por padrões de nomes de arquivos

Na melhor das hipóteses, gostaria de receber uma ligação como esta:

$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"

... para que esta ferramenta

  • faz uma varredura recursiva do caminho fornecido
  • pega todos os arquivos com formatos de arquivo suportados que devem ser pelo menos os "mais comuns" como zip, rar, 7z, tar.bz, tar.gz ...
  • e verifique a lista de arquivos do arquivo em busca do padrão de nome em questão (aqui *vacation*jpg)

Estou ciente de como usar a ferramenta localizar, tar, descompactar e similares. Eu poderia combiná-los com um script de shell, mas estou procurando uma solução simples que possa ser um shell de uma linha ou uma ferramenta dedicada (dicas para ferramentas GUI são bem-vindas, mas minha solução deve ser baseada em linha de comando).

Responder1

Se você quiser algo mais simples que a solução AVFS, escrevi um script Python para fazer isso chamadoarkfind. Você pode simplesmente fazer

$ arkfind /path/to/search/ -g "*vacation*jpg"

Ele fará isso recursivamente, para que você possa examinar os arquivos dentro dos arquivos em uma profundidade arbitrária.

Responder2

(Adaptado deComo faço para percorrer recursivamente arquivos compactados?)

InstalarAVFS, 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 da sua máquina na qual você pode acessar arquivos como se fossem diretórios:

mountavfs

Depois disso, se /path/to/archive.zipfor um arquivo reconhecido, então ~/.avfs/path/to/archive.zip#será 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 arquivos compactados em ~/.avfs$PWD, que é a visualização AVFS do diretório atual.
  • Para cada arquivo, execute o snippet de shell especificado (com $0= nome do arquivo e $1= padrão para pesquisar).
  • $0#é a visualização do diretório do arquivo $0.
  • {\}em vez de {}ser necessário caso o exterior findsubstitua os argumentos {}internos -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 aos arquivos na visualização AVFS do diretório atual e seus subdiretórios.
  • PATTERN(e\''CODE'\')aplica CODE a cada correspondência de PATTERN. O nome do arquivo correspondente está em $REPLY. Definir a replymatriz transforma a correspondência em uma lista de nomes.
  • $REPLY\#é a visualização do diretório do arquivo.
  • $REPLY\#/**/*vacation*.jpgcorresponde *vacation*.jpgaos arquivos no arquivo.
  • O Nqualificador glob faz com que o padrão se expanda para uma lista vazia se não houver correspondência.

Responder3

Outra solução que funciona ézgrep

zgrep -r filename *.zip

Responder4

Meuhabitualsolução:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'

Exemplo:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'

Os resultados são como:

foozip1.zip:
foozip2.zip:
foozip3.zip:
    DESIRED_FILE_TO_SEARCH
foozip4.zip:
...

Se você quiser apenas o arquivo zip comexitosnele:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'

NOME DO ARQUIVOaqui é usado duas vezes, então você pode usar uma variável.

Com find você pode usarCAMINHO/PARA/PESQUISA

informação relacionada