лише файли списку tar


16

Факт забави: Якщо ви використовуєте Archive Manager і витягаєте .tar.gz, щоб у вас не було порушено "Зберігати структуру каталогів", ви отримаєте tarbomb .

tar -ztfперелічує всі файли та каталоги у файлі tar. Чи є спосіб перерахувати всі файли у файлі tar без структури каталогів?


Ви можете отримати ефект 'tarbomb' за допомогою tar xvzf my_tar.tar.gz --transform 's/.*\///'. Але, на жаль, це не змінює спосіб відображення в лістингу, tа не x.
ire_and_curses

4
Мене хвилює те, що навіть добре структуровані архіви можна так легко використовувати для створення зброї масового видобутку.
Eero Aaltonen

Відповіді:


17

Я не бачу способу це зробити зі сторінки man, але ви завжди можете фільтрувати результати. Далі передбачається, що у назвах ваших файлів немає нових рядків:

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

Як це працює

Встановивши роздільник поля /, останнє поле awkзнає про ( $NF) - це або ім'я файлу, якщо він обробляє ім'я файлу, або порожнє, якщо воно обробляє ім'я каталогу ( tarдодає проміжну косу рису до імен каталогів). Отже, ми в основному кажемо awkнадрукувати останнє поле, якщо воно не порожнє.


Досить приємна робота з awk :)
Eero Aaltonen

5

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

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


Це все ще виводить foo/barна відміну від справедливого bar. Ви хочете grep -Eo '[^/]+$'(з GNU grep).
Стефан Шазелас

4

Якщо жодне з назв файлів не містить нових рядків:

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

Перша команда sed видаляє все до останнього /у рядку, так що друкується лише частина імені файлу. Друга команда видаляє рядки, які тепер порожні, тобто рядки, які закінчилися в а /, які є каталогами.


sed: -e вираз №2, графік 2: невідома команда: `/ 'і синтаксис sed не дуже відчуває .. інтуїтивно
Eero Aaltonen

@EeroAaltonen Я виправив команду sed. Дійсно, синтаксис дещо криптовалютний (я включаю пояснення у свою відповідь).
Жил "ТАК - перестань бути злим"

2

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.