在整个 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"' \;

如果您不想搜索整个计算机而只想搜索特定目录(递归),您可以将其指定为第一个参数 afterfind而不是/.tar.gz要处理的档案的后缀也是不区分大小写的,除非您将 after-iname替换findname

输出可能看起来像这样(搜索/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 函数中(例如,如果您希望它在每个新的 Bash 会话中都可用,则archive-search附加到您的函数中):~/.bashrc

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

相关内容