Подтвердить что ты не робот

Выполнение grep-операции в tar файлах без извлечения

У меня есть список файлов, содержащих определенные шаблоны, но эти файлы были tarred. Теперь я хочу искать шаблон в tar файле и знать, какие файлы содержат шаблон без извлечения файлов.

Любая идея...?

4b9b3361

Ответ 1

В команде 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

Ответ 3

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}'"

Ответ 4

Python tarfile module вместе с Tarfile.extractfile() позволит вам проверить содержимое tarball, не извлекая его на диск.

Ответ 5

Самый простой способ - использовать avfs. Я использовал это раньше для таких задач.

В принципе, синтаксис:

avfsd ~/.avfs # Sets up a avfs virtual filesystem
rgrep pattern ~/.avfs/path/to/file.tar#/

/path/to/file.tar - это путь к фактическому файлу tar.

Предварительно ожидающая ~/.avfs/ (точка монтирования) и добавление # позволяет avfs выставлять tar файл в качестве каталога.