ランダムな場所にたくさんの 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
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
アーカイブ パスが 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