у меня есть партия tar.gz файлов в случайном месте, и я хочу искать файл во всем tar.gz файле
например:
/root/a.tar.gz
/home/backup-2016.tar.gz
/home2/user/files/2015/abc.tar.gz
я ищу файл или папку в них
Можно использовать эту (довольно длинную) остроту, заменяя 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