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置き換えない限り、大文字と小文字は区別されません。-inamefindname

出力は次のようになります (/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

アーカイブ パスが 1 行に表示され、その後にパターンに一致するすべてのコンテンツ エントリが、それぞれ 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

関連情報