Ищите файл во всех tar.gz

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

например:

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

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

1
задан 5 September 2016 в 03:13

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 суффикс для архивов для обработки нечувствителен к регистру также, если Вы не заменяете -iname после 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
2
ответ дан 7 December 2019 в 13:42

Другие вопросы по тегам:

Похожие вопросы: