在所有 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也不區分大小寫,除非將-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

相關內容