только файлы списка тар

16

Интересный факт: если вы используете Archive Manager и извлекаете .tar.gz, чтобы у вас не было отметки «Сохранить структуру каталогов», вы получите тарбомбу .

tar -ztfперечисляет все файлы и каталоги в файле tar. Есть ли способ перечислить все файлы в файле tar, без структуры каталогов?

Ээро Аалтонен
источник
Вы можете получить эффект «tarbomb» с tar xvzf my_tar.tar.gz --transform 's/.*\///'. Но, к сожалению, это не меняет того, как оно отображается в списке, tа не x.
ire_and_curses
4
Меня беспокоит то, что даже хорошо структурированные архивы можно легко использовать для создания оружия массового извлечения.
Ээро Аалтонен

Ответы:

17

Я не вижу способа сделать это со страницы руководства, но вы всегда можете отфильтровать результаты. Следующее предполагает, что в именах файлов нет новых строк:

tar tzf your_archive | awk -F/ '{ if($NF != "") print $NF }'

Как это устроено

При установке разделителя полей /на последнее поле awkзнает о ( $NF) либо имя файла, если оно обрабатывает имя файла, либо пустое, если оно обрабатывает имя каталога ( tarдобавляет косую черту к именам каталогов). Итак, мы в основном советуем awkнапечатать последнее поле, если оно не пустое.

Джозеф Р.
источник
Довольно хорошая работа с awk :)
Ээро Аалтонен
5

Используя Джозеф Р. по рекомендации можно использовать регулярное выражение [^/]$для grepдля файлов путем поиска строк не заканчивается /.

tar tzf archive.tar.gz | grep -e "[^/]$"

user116835
источник
Это все еще выводит foo/barв отличие от просто bar. Вы хотите grep -Eo '[^/]+$'(с GNU grep).
Стефан Шазелас
4

Предполагая, что ни одно из имен файлов не содержит символов новой строки:

tar -tf foo.tar | sed -e 's#.*/##' -e '\#.#!d'

Первая команда sed удаляет все, что находится перед последней /в строке, так что печатается только часть имени файла. Вторая команда удаляет строки, которые теперь пусты, т.е. строки, оканчивающиеся на a /, которые являются каталогами.

Жиль "ТАК - перестань быть злым"
источник
sed: -e выражение # 2, char 2: неизвестная команда: `/ ', а синтаксис sed не слишком чувствителен ... интуитивно понятен
Eero Aaltonen
@EeroAaltonen Я исправил команду sed. Действительно, синтаксис несколько загадочный (я включаю объяснения в мой ответ).
Жиль "ТАК - перестань быть злым"
2

С pax(команда POSIX для чтения tarфайлов):

pax -'s@.*/@@' < file.tar

(в котором перечислены все файлы независимо от их типа, включая каталоги).

Стефан Шазелас
источник