Поиск файла внутри всех tar.gz

Поиск файла внутри всех tar.gz

У меня много файлов tar.gz в случайном месте, и я хочу найти файл внутри всех файлов tar.gz.

например :

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

я ищуфайлилипапкавнутри них

решение1

Вы можете использовать этот (довольно длинный) однострочный текст, заменив его PATTERNна свой шаблон поиска (регистр не важен, если только вы не удалите -iопцию после 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"' \;

Если вы не хотите выполнять поиск по всему компьютеру, а только в определенном каталоге (рекурсивно), вы можете указать его в качестве первого аргумента после findвместо /. .tar.gzСуффикс для обрабатываемых архивов также нечувствителен к регистру, если только вы не замените -inameafter findна name.

Вывод может выглядеть примерно так (поиск /usr/share/docшаблона 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

Вы видите путь к архиву в одной строке, за которым следуют все записи содержимого, соответствующие шаблону, каждая в отдельной строке с отступом в 4 пробела.


Это также можно поместить в скрипт (например archive-search, не забудьте сделать его исполняемым с помощью 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" \;

или в функции Bash (например archive-search, добавьте ее к своей, ~/.bashrcесли хотите, чтобы она была доступна в каждом новом сеансе 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" \;
}

И скрипт, и функция принимают шаблон поиска и каталог в качестве аргументов командной строки, например:

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

Связанный контент