solo i file dell'elenco tar


16

Curiosità: se usi Archive Manager ed estrai un .tar.gz in modo da avere "Mantieni la struttura della directory" deselezionata, otterrai un tarbomb .

tar -ztfelenca tutti i file e le directory in un file tar. C'è un modo per elencare tutti i file in un file tar, senza la struttura delle directory?


Puoi ottenere l'effetto 'tarbomb' con tar xvzf my_tar.tar.gz --transform 's/.*\///'. Ma sfortunatamente ciò non cambia il modo in cui viene visualizzato in un elenco tpiuttosto che x.
ire_and_curses il

4
Ciò che mi preoccupa è che anche archivi ben strutturati possono essere così facilmente utilizzati per creare armi di estrazione di massa.
Eero Aaltonen,

Risposte:


17

Non vedo un modo per farlo dalla pagina man, ma puoi sempre filtrare i risultati. Quanto segue non presuppone nessuna nuova riga nei nomi dei file:

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

Come funziona

Impostando il separatore di campo su /, l'ultimo campo awksa che ( $NF) è il nome del file se sta elaborando un nome di file o vuoto se sta elaborando un nome di directory ( taraggiunge una barra finale ai nomi di directory). Quindi, in pratica, stiamo dicendo awkdi stampare l'ultimo campo se non è vuoto.


Bel lavoro con awk :)
Eero Aaltonen,

5

Utilizzando il suggerimento uno di Joseph R. può usare l'espressione regolare [^/]$per grepi file, cercando per le linee non termina con /.

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


Ciò produce ancora foo/barpiuttosto che giusto bar. Tu vuoi grep -Eo '[^/]+$'(con GNU grep).
Stéphane Chazelas,

4

Supponendo che nessuno dei nomi dei file contenga nuove righe:

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

Il primo comando sed rimuove tutto prima dell'ultimo /su una riga, in modo che venga stampata solo la parte del nome file. Il secondo comando cancella le righe che ora sono vuote, ovvero le righe che terminano in a /, che sono directory.


sed: -e espressione # 2, carattere 2: comando sconosciuto: `/ 'e la sintassi di sed non sembra molto .. intuitiva
Eero Aaltonen

@EeroAaltonen Ho corretto il comando sed. In effetti, la sintassi è in qualche modo criptica (includo spiegazioni nella mia risposta).
Gilles 'SO- smetti di essere malvagio' il

2

Con pax(il comando POSIX per leggere i tarfile):

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

(che elenca tutti i file indipendentemente dal loro tipo, comprese le directory).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.