solo archivos de lista tar

16

Dato curioso: si usa el Administrador de archivos y extrae un archivo .tar.gz para que no tenga marcada la opción "Mantener la estructura del directorio", obtendrá una tarbomb .

tar -ztfenumera todos los archivos y directorios en un archivo tar. ¿Hay alguna manera de enumerar todos los archivos en un archivo tar, sin la estructura de directorios?

Eero Aaltonen
fuente
Puede obtener el efecto 'tarbomb' con tar xvzf my_tar.tar.gz --transform 's/.*\///'. Pero desafortunadamente eso no cambia la forma en que se muestra en una lista con en tlugar de x.
ire_and_curses
44
Lo que me molesta es que incluso los archivos bien estructurados pueden usarse tan fácilmente para crear armas de extracción masiva.
Eero Aaltonen

Respuestas:

17

No veo una manera de hacerlo desde la página de manual, pero siempre puedes filtrar los resultados. Lo siguiente supone que no hay líneas nuevas en los nombres de sus archivos:

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

Cómo funciona

Al establecer el separador de campo en /, el último campo que awkconoce sobre ( $NF) es el nombre del archivo si está procesando un nombre de archivo o está vacío si está procesando un nombre de directorio ( taragrega una barra diagonal final a los nombres de directorio). Entonces, básicamente le estamos diciendo awkque imprima el último campo si no está vacío.

Joseph R.
fuente
Bastante buen trabajo con awk :)
Eero Aaltonen
5

Utilizando una sugerencia de Joseph R. puede utilizar la expresión regular [^/]$a greplos archivos mediante la búsqueda de líneas no termina con /.

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

usuario116835
fuente
Eso todavía sale foo/baren lugar de justo bar. Tú quieres grep -Eo '[^/]+$'(con GNU grep).
Stéphane Chazelas
4

Suponiendo que ninguno de los nombres de archivo contenga nuevas líneas:

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

El primer comando sed elimina todo antes del último /en una línea, de modo que solo se imprime la parte del nombre del archivo. El segundo comando elimina las líneas que ahora están vacías, es decir, las líneas que terminaron en a /, que son directorios.

Gilles 'SO- deja de ser malvado'
fuente
sed: -e expresión # 2, char 2: comando desconocido: `/ 'y la sintaxis sed no se siente muy .. intuitiva
Eero Aaltonen
@EeroAaltonen Arreglé el comando sed. De hecho, la sintaxis es algo críptica (sí incluyo explicaciones en mi respuesta).
Gilles 'SO- deja de ser malvado'
2

Con pax(el comando POSIX para leer tararchivos):

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

(que enumera todos los archivos independientemente de su tipo, incluidos los directorios).

Stéphane Chazelas
fuente