Você pode usar esse one-liner (longo), substituindo PATTERN
pelo padrão de pesquisa (não diferencia maiúsculas de minúsculas, a menos que você remova a opção -i
após grep
):
find / -iname "*.tar.gz" -exec bash -c 'result=$(set -o pipefail ; echo "{}" ; tar -tf {} | grep -i "PATTERN" | sed "s/^/ /") ; test $? -eq 0 && printf "$result\n"' \;
Se você não quiser pesquisar em todo o seu computador, mas apenas em um diretório específico (recursivamente), você pode especificar isso como primeiro argumento após find
em vez do /
. O sufixo .tar.gz
para processamento de arquivos também não diferencia maiúsculas de minúsculas, a menos que você substitua o -iname
após find
por name
.
A saída pode parecer assim (pesquisando em /usr/share/doc
para o padrão default
):
/usr/share/doc/openjdk-8-jre-headless/test-amd64/failed_tests-hotspot.tar.gz
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestInnerDefault.jtr
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestSuperDefault.jtr
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestVarArgsSuperDefault.jtr
test/langtools/JTwork/tools/javac/lambdaShapes/org/openjdk/tests/vm/DefaultMethodsTest.jtr
/usr/share/doc/apg/php.tar.gz
./themes/default.php
Você vê o caminho do arquivo em uma linha, seguido por todas as entradas de conteúdo correspondentes ao padrão, cada uma em uma linha separada recuada por 4 espaços.
Isso também pode ser colocado em um script (por exemplo, archive-search
, não se esqueça de torná-lo executável com chmod +x FILENAME
):
#!/bin/bash
# Usage: archive-search PATTERN DIRECTORY
find "$2" -iname "*.tar.gz" -exec bash -c '
result=$(
set -o pipefail
echo "{}"
tar -tf {} | grep -i "$0" | sed "s/^/ /"
)
test $? -eq 0 && printf "$result\n"
' "$1" \;
ou em uma função Bash (por exemplo, archive-search
, anexada ao seu ~/.bashrc
, se você quiser que ela esteja disponível em cada nova sessão Bash):
archive-search () {
# Usage: archive-search PATTERN DIRECTORY
find "$2" -iname "*.tar.gz" -exec bash -c '
result=$(
set -o pipefail
echo "{}"
tar -tf {} | grep -i "$0" | sed "s/^/ /"
)
test $? -eq 0 && printf "$result\n"
' "$1" \;
}
Tanto o script quanto a função levam o padrão de pesquisa e o diretório como argumentos da linha de comando, assim:
archive-search "default" /usr/share/doc