Pesquisando dentro de arquivos para arquivos e padrões específicos [duplicado]

1

É possível encontrar um monte de arquivos com expressões regulares nos nomes dos arquivos que eles contêm e no conteúdo desses arquivos? Gostaria de saber quais arquivos em que os arquivos correspondem ao padrão. Eu estou no OS X, se isso importa.

    
por Emre 27.08.2015 / 06:14

1 resposta

1

Se você precisar usar padrões de arquivo mais expressivos no estilo grep :

tar -OT <(tar -tf /path/to/file.tar | grep 'FILE_PATTERN') -xf /path/to/file.tar \
    | grep 'CONTENT_PATTERN'

-O especifica a saída como stdout e -T especifica um arquivo contendo nomes a serem extraídos, quando usado em conjunto com -x .

Se uma expansão do nome do caminho mais simples for boa o suficiente, você pode substituir a substituição do processo ( <( ... ) ) com uma linha echo mais simples, isso evita ter que executar tar no arquivo duas vezes:

tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
    | grep 'CONTENT_PATTERN'

Se você também quiser ver os nomes dos arquivos, adicione a -v flag (pessoalmente, eu irei para -xvf ), mas você também precisará modificar CONTENT_PATTERN para grep para os nomes dos arquivos novamente. Vou deixar isso como um exercício para o leitor ...

É um pouco complicado, e você provavelmente terá que usar awk para um pouco mais de processamento de saída ... Os nomes dos arquivos correspondentes serão exibidos por linha, então infelizmente não há um delimitador bem definido aqui. Presumindo que nomes de arquivos não serão repetidos como conteúdo :

tar ... | awk '/^FILLE_AWK_PATTERN$/{f=$0;next}...'

Isso define o awk variable f para cada novo nome de arquivo encontrado e pula para a próxima linha . Então,

tar ... | awk '...$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'

Quando virmos uma linha correspondente, imprimiremos $f e redefiniremos nosso nome de arquivo até que o próximo arquivo seja 'encontrado'.

Colocando tudo junto:

tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
    | awk '/^FILLE_AWK_PATTERN$/{f=$0;next};$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'
    
por 27.08.2015 / 09:16