Busque un archivo dentro de todo tar.gz

Busque un archivo dentro de todo tar.gz

Tengo muchos archivos tar.gz en un lugar aleatorio y quiero buscar un archivo dentro de todos los archivos tar.gz.

Por ejemplo :

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

Buscoarchivoocarpetadentro de ellos

Respuesta1

Puede usar esta frase (bastante larga), reemplazándola PATTERNcon su patrón de búsqueda (no distingue entre mayúsculas y minúsculas a menos que elimine la -iopción después de 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"' \;

Si no desea buscar en toda su computadora sino solo en un directorio específico (de forma recursiva), puede especificarlo como primer argumento después finddel archivo /. El .tar.gzsufijo para que los archivos se procesen tampoco distingue entre mayúsculas y minúsculas, a menos que reemplace el -inamedespués findcon name.

El resultado podría verse así (buscando /usr/share/docel patrón 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

Verá la ruta del archivo en una línea seguida de todas las entradas de contenido que coinciden con el patrón, cada una en una línea separada con una sangría de 4 espacios.


Esto también se puede poner en un script (por ejemplo archive-search, no olvide hacerlo ejecutable con 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" \;

o en una función Bash (por ejemplo archive-search, añádela a tu ~/.bashrcsi quieres tenerla disponible en cada nueva sesión de 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 el script como la función toman el patrón de búsqueda y el directorio como argumentos de línea de comando, como este:

archive-search "default" /usr/share/doc

información relacionada