Tylko pliki listy tar

16

Ciekawostka: jeśli użyjesz Archive Managera i wyodrębnisz plik .tar.gz, aby mieć zaznaczoną opcję „Zachowaj strukturę katalogów”, otrzymasz tarbomb .

tar -ztfwyświetla listę wszystkich plików i katalogów w pliku tar. Czy istnieje sposób wylistowania wszystkich plików w pliku tar bez struktury katalogów?

Eero Aaltonen
źródło
Możesz uzyskać efekt „tarbomb” za pomocą tar xvzf my_tar.tar.gz --transform 's/.*\///'. Ale niestety nie zmienia to sposobu wyświetlania na liście za pomocą tzamiast x.
ire_and_curses
4
Niepokoi mnie to, że nawet dobrze ustrukturyzowane archiwa można tak łatwo wykorzystać do tworzenia broni masowej ekstrakcji.
Eero Aaltonen,

Odpowiedzi:

17

Nie widzę sposobu, aby to zrobić na stronie podręcznika, ale zawsze możesz filtrować wyniki. Poniższe zakłada, że ​​w nazwach plików nie ma nowego wiersza:

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

Jak to działa

Ustawiając separator pól na /, ostatnie pole awkwie o ( $NF) to albo nazwa pliku, jeśli przetwarza nazwę pliku, albo pusta, jeśli przetwarza nazwę katalogu ( tardodaje ukośnik końcowy do nazw katalogów). Mówimy więc, awkaby wydrukować ostatnie pole, jeśli nie jest puste.

Joseph R.
źródło
Całkiem niezła praca z awk :)
Eero Aaltonen
5

Wykorzystując jedną sugestię Joseph R. może używać regex [^/]$do grepdla plików patrząc na linie nie kończąc /.

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

użytkownik116835
źródło
To wciąż wychodzi foo/barw przeciwieństwie do just bar. Chcesz grep -Eo '[^/]+$'(z GNU grep).
Stéphane Chazelas
4

Zakładając, że żadna z nazw plików nie zawiera nowych linii:

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

Pierwsze polecenie sed usuwa wszystko przed ostatnim /w wierszu, dzięki czemu drukowana jest tylko część nazwy pliku. Drugie polecenie usuwa wiersze, które są teraz puste, tj. Linie kończące się na a /, które są katalogami.

Gilles „SO- przestań być zły”
źródło
sed: -e wyrażenie # 2, char 2: nieznane polecenie: `/ ', a składnia sed nie wydaje się bardzo .. intuicyjna
Eero Aaltonen
@EeroAaltonen Naprawiłem polecenie sed. Rzeczywiście, składnia jest nieco tajemnicza (w odpowiedzi podaję wyjaśnienia).
Gilles „SO- przestań być zły”,
2

Za pomocą pax(polecenie POSIX do odczytu tarplików):

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

(zawiera listę wszystkich plików niezależnie od ich typu, w tym katalogów).

Stéphane Chazelas
źródło