2011-08-22 5 views
31

Cuando hago unzip -l zipfilename, veolista Extracto de nombres de archivo en un archivo zip, cuando `descomprima -l`

1295627 08-22-11 07:10 A.pdf 
473980 08-22-11 07:10 B.pdf 
... 

Yo sólo quiero ver los nombres de archivo. Intento esto

unzip -l zipFilename | cut -f4 -d" " 

pero no creo que el delimitador es solo " ".

+0

Si el número de espacios es fijo, debe avanzar el campo en consecuencia, como '-f7' más o menos. Si la * posición * del nombre del archivo es fija, use '-b' en su lugar. –

+0

Relacionado en [SU]: [Ver archivos en archivo ZIP en Linux] (http://superuser.com/q/216617/269404) – Palec

Respuesta

24

Suponiendo que ninguno de los archivos tienen espacios de nombres:

unzip -l filename.zip | awk '{print $NF}' 

Mi salida de descompresión tiene tanto un encabezado y pie de página, por lo que el script de awk se convierte en:

unzip -l filename.zip | awk '/-----/ {p = ++p % 2; next} p {print $NF}' 

Una versión que maneja s nombres de archivo con espacios:

unzip -l filename.zip | awk ' 
    /----/ {p = ++p % 2; next} 
    $NF == "Name" {pos = index($0,"Name")} 
    p {print substr($0,pos)} 
' 
+2

¿Sería posible si puede explicar un poco su script 'awk'. Entiendo totalmente si no tienes tiempo para eso. –

+4

Awk tiene una variable 'NF' por línea, que es el número de campos. '$ NF' es el valor del último campo, así es como se obtiene el nombre del archivo. El segundo script funciona estableciendo la variable 'p' en verdadero cuando aparece la primera línea con" ----- ", y el bloque' {printf $ NF} 'solo se ejecuta si' p' es verdadero. –

+5

Puede deshacerse del encabezado y pie de página utilizando la opción -qq: 'unzip -l -qq filename.zip'. Entonces, la declaración de awk más simple funcionará. – amicitas

3

Uso awk:

unzip -l zipfilename | awk '{print $4}' 
+0

Sin embargo, tenga cuidado con los nombres de archivo malignos que contienen espacios. – nos

6

Si tiene que atender a los nombres de archivo con espacios, intente:

unzip -l zipfilename.zip | awk -v f=4 ' /-----/ {p = ++p % 2; next} p { for (i=f; i<=NF;i++) printf("%s%s", $i,(i==NF) ? "\n" : OFS) }' 
93

La forma más sencilla de hacerlo es utilizar el siguiente comando:

unzip -Z -1 archive.zip 

o

zipinfo -1 archive.zip 

Esto mostrará solo los nombres de los archivos, uno en cada línea.

Los dos comandos son exactamente equivalentes. La opción -Z le dice a descomprimir que trate el resto de las opciones como opciones de zipinfo. Consulte las páginas man para unzip y zipinfo.

Cuestiones relacionadas