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?


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.


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 "[^/]$"


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.


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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.