У меня есть список файлов, содержащих определенные шаблоны, но эти файлы были tarred. Теперь я хочу искать шаблон в tar файле и знать, какие файлы содержат шаблон без извлечения файлов.
Любая идея...?
У меня есть список файлов, содержащих определенные шаблоны, но эти файлы были tarred. Теперь я хочу искать шаблон в tar файле и знать, какие файлы содержат шаблон без извлечения файлов.
Любая идея...?
В команде tar
есть переключатель -O
, чтобы извлечь ваши файлы на стандартный вывод. Таким образом, вы можете подключить эти выходные данные к grep/awk
tar xvf test.tar -O | awk '/pattern/{print}'
tar xvf test.tar -O | grep "pattern"
например, чтобы вернуть имя файла в один найденный шаблон
tar tf myarchive.tar | while read -r FILE
do
if tar xf test.tar $FILE -O | grep "pattern" ;then
echo "found pattern in : $FILE"
fi
done
Команда zgrep
должна делать именно то, что вы хотите, напрямую.
например
zgrep "mypattern" *.gz
GNU tar
имеет --to-command
. С его помощью вы можете tar
передать каждый файл из архива в заданную команду. Для случая, когда вам просто нужны строки, которые соответствуют, эта команда может быть простой grep
. Чтобы узнать имена файлов, вам необходимо использовать tar для определения определенных переменных в командной среде; например,
tar xaf thing.tar.xz --to-command="awk -e '/thing.to.match/ {print ENVIRON[\"TAR_FILENAME\"] \":\", \$0}'"
Поскольку я часто пользуюсь этим, у меня есть это:
#!/bin/sh
set -eu
if [ $# -lt 2 ]; then
echo "Usage: $(basename "$0") <pattern> <tarfile>"
exit 1
fi
if [ -t 1 ]; then
h="$(tput setf 4)"
m="$(tput setf 5)"
f="$(tput sgr0)"
else
h=""
m=""
f=""
fi
tar xaf "$2" --to-command="awk -e '/$1/{gsub(\"$1\", \"$m&$f\"); print \"$h\" ENVIRON[\"TAR_FILENAME\"] \"$f:\", \$0}'"
Python tarfile
module вместе с Tarfile.extractfile()
позволит вам проверить содержимое tarball, не извлекая его на диск.
Самый простой способ - использовать avfs. Я использовал это раньше для таких задач.
В принципе, синтаксис:
avfsd ~/.avfs # Sets up a avfs virtual filesystem
rgrep pattern ~/.avfs/path/to/file.tar#/
/path/to/file.tar
- это путь к фактическому файлу tar.
Предварительно ожидающая ~/.avfs/
(точка монтирования) и добавление # позволяет avfs выставлять tar файл в качестве каталога.