Suche nach einer Datei im gesamten tar.gz

Suche nach einer Datei im gesamten tar.gz

ich habe eine Menge tar.gz-Dateien an zufälligen Orten und ich möchte in allen tar.gz-Dateien nach einer Datei suchen

Zum Beispiel :

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

ich suche nachDateioderOrdnerin ihnen

Antwort1

Sie können diesen (ziemlich langen) Einzeiler verwenden und ihn PATTERNdurch Ihr Suchmuster ersetzen (ohne Berücksichtigung der Groß-/Kleinschreibung, sofern Sie die -iOption nach entfernen 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"' \;

Wenn Sie nicht Ihren gesamten Computer durchsuchen möchten, sondern nur ein bestimmtes Verzeichnis (rekursiv), können Sie dies als erstes Argument nach findanstelle von angeben /. Das .tar.gzSuffix für zu verarbeitende Archive ist ebenfalls nicht case-sensitiv, sofern Sie das -inamenach nicht finddurch ersetzen name.

Die Ausgabe könnte etwa so aussehen (Suche nach /usr/share/docdem Muster 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

Sie sehen den Archivpfad in einer Zeile, gefolgt von allen Inhaltseinträgen, die dem Muster entsprechen, jeweils in einer separaten Zeile, eingerückt um 4 Leerzeichen.


Dies kann auch in ein Skript eingefügt werden ( archive-searchvergessen Sie nicht, es beispielsweise mit ausführbar zu machen 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" \;

oder in einer Bash-Funktion (z. B. archive-searchanhängen, ~/.bashrcwenn es in jeder neuen Bash-Sitzung verfügbar sein soll):

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" \;
}

Sowohl das Skript als auch die Funktion verwenden Suchmuster und Verzeichnis als Befehlszeilenargumente, wie folgt:

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

verwandte Informationen