Procura por um arquivo dentro de todo o tar.gz

0

eu tenho muitos arquivos tar.gz em lugares aleatórios e eu quero procurar um arquivo dentro de todo o arquivo tar.gz

por exemplo:

/root/a.tar.gz
/home/backup-2016.tar.gz
/home2/user/files/2015/abc.tar.gz

Eu estou procurando pelo arquivo ou pasta dentro deles

    
por user3325376 05.09.2016 / 02:13

1 resposta

2

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
    
por Byte Commander 05.09.2016 / 04:30