Nur Teerlistendateien

15

Unterhaltsame Tatsache: Wenn Sie Archive Manager verwenden und eine .tar.gz-Datei extrahieren, sodass die Option "Verzeichnisstruktur beibehalten" deaktiviert ist, erhalten Sie eine Tarbomb .

tar -ztflistet alle Dateien und Verzeichnisse in einer tar-Datei auf. Gibt es eine Möglichkeit, alle Dateien in einer TAR-Datei ohne die Verzeichnisstruktur aufzulisten?

Eero Aaltonen
quelle
Sie können den "Tarbomb" -Effekt mit erhalten tar xvzf my_tar.tar.gz --transform 's/.*\///'. Aber leider ändert das nichts daran, wie es in einer Auflistung mit tanstatt angezeigt wird x.
ire_and_curses
4
Was mich stört, ist, dass selbst gut strukturierte Archive so einfach zur Herstellung von Massenextraktionswaffen verwendet werden können.
Eero Aaltonen

Antworten:

17

Ich sehe in der Manpage keine Möglichkeit, dies zu tun, aber Sie können die Ergebnisse immer filtern. Im Folgenden wird davon ausgegangen, dass Ihre Dateinamen keine Zeilenumbrüche enthalten:

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

Wie es funktioniert

Wenn Sie das Feldtrennzeichen auf setzen /, ist das letzte Feld, awkdas über ( $NF) informiert ist, entweder der Dateiname, wenn ein Dateiname verarbeitet wird, oder leer, wenn ein Verzeichnisname verarbeitet wird ( tarfügt den Verzeichnisnamen einen abschließenden Schrägstrich hinzu). Wir empfehlen also awk, das letzte Feld auszudrucken, wenn es nicht leer ist.

Joseph R.
quelle
Ziemlich gute Arbeit mit awk :)
Eero Aaltonen
5

Joseph R. Vorschlag einer Verwendung kann die Regex verwenden , [^/]$um grepfür die Dateien , die von der Suche nach Zeilen mit nicht enden /.

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

user116835
quelle
Das gibt immer noch foo/barim Gegensatz zu nur bar. Du willst grep -Eo '[^/]+$'(mit GNU grep).
Stéphane Chazelas
4

Angenommen, keiner der Dateinamen enthält Zeilenumbrüche:

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

Der erste sed-Befehl entfernt alles vor dem letzten /in einer Zeile, sodass nur der Dateinamensabschnitt gedruckt wird. Der zweite Befehl löscht die jetzt leeren Zeilen, dh die Zeilen, die mit a geendet /haben und Verzeichnisse sind.

Gilles 'SO - hör auf böse zu sein'
quelle
sed: -e expression # 2, char 2: unknown command: `/ 'und die sed syntax fühlt sich nicht sehr .. intuitiv an
Eero Aaltonen
@EeroAaltonen Ich habe den sed-Befehl behoben. In der Tat ist die Syntax etwas kryptisch (ich gebe Erklärungen in meine Antwort ein).
Gilles 'SO - hör auf böse zu sein'
2

Mit pax(dem POSIX-Befehl zum Lesen von tarDateien):

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

(Hier werden alle Dateien unabhängig von ihrem Typ aufgelistet, einschließlich der Verzeichnisse).

Stéphane Chazelas
quelle