Ok, vamos aplicar a filosofia unix. Quais são os componentes desta tarefa?
- Pesquisa de texto: você precisa de uma ferramenta para pesquisar texto em um arquivo, como
grep
. - Recursivo: você precisa de uma ferramenta para procurar arquivos em uma árvore de diretórios, como
find
. - Arquivos: você precisa de uma ferramenta para lê-los.
A maioria dos programas unix operam em arquivos. Portanto, para operar facilmente em componentes de arquivo, você precisa acessá-los como arquivos, em outras palavras, você precisa acessá-los como diretórios.
O sistema de arquivos AVFS apresenta uma visão do sistema de arquivos em que cada arquivo /path/to/foo.zip
está acessível como um diretório ~/.avfs/path/to/foo/zip#
. O AVFS fornece acesso somente leitura aos formatos de arquivo mais comuns.
mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*.pm" -exec grep "$1" {\} +
' {} 'Test::Version' \;
fusermount -u ~/.avfs # optional
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). - Opcional: finalmente, desmonte o sistema de arquivos AVFS.
Ou em zsh ≥4.3:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
Explicações:
-
~/.avfs$PWD/**/*.(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\#/**/*.pm
corresponde a.pm
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.