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