Extrae solo un archivo específico de un archivo comprimido a un directorio dado

152

Necesito extraer un solo archivo de un archivo ZIP que conozco la ruta. ¿Hay un comando como el siguiente:

unzip -d . myarchive.zip path/to/zipped/file.txt

Desafortunadamente, el comando anterior extrae y recrea la ruta completa al archivo en ./path/to/zipped/file.txt. ¿Hay alguna manera de simplemente extraer el archivo en un directorio específico?

Naftuli Kay
fuente

Respuestas:

130

Puede extraer solo el texto a la salida estándar con la -popción:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

Esto no extraerá los metadatos (fecha, permisos, ...), solo el contenido del archivo. Ese es el precio a pagar por la conveniencia de no tener que mover el archivo después.

Alternativamente, monte el archivo como un directorio y simplemente copie el archivo. Con AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

O con fusible-zip :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d
Gilles
fuente
2
@TK Kocheran: ¿Por qué no lo pruebas? Probé el primer comando y funcionó.
usuario desconocido
1
@TKKocheran: los archivos Jar son zip, por lo que los métodos de descomprimir y fuse-zip obviamente funcionarán. El método AVFS también funciona, porque AVFS adivina el formato en función de los nombres de archivo y conoce .jar; Si su archivo tiene un nombre diferente, es posible que deba indicarle a AVFS que use su controlador zip, por ejemplo ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles
1
en realidad, me refería a extraer un archivo JAR / binario de un archivo ZIP. Todavía no he tenido la oportunidad de probarlo, ¿puedes ver algún problema con el primer comando anterior para extraer archivos binarios?
Naftuli Kay
2
@TKKocheran: No hay problema, -pextrae el archivo tal como está ( -crealiza la conversión de texto).
Gilles
2
Creo que la respuesta de @Myles es más elegante, porque no requiere la redirección de salida y conserva los atributos del archivo.
gertvdijk
153
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Ingrese la ruta completa para el archivo comprimido, no solo el nombre del archivo. Asegúrese de mantener la estructura como se ve desde dentro del archivo zip.

Esto extraerá el archivo único file.txten myarchive.zipa /path/to/unzip/to/file.txt.

sMyles
fuente
18
Esta es la mejor respuesta.
Redburn
1
No maneja el caso en el que desea que el nombre de archivo generado sea diferente.
Oleg Vaskevich
66
el parámetro "-j": caminos basura. La estructura del directorio del archivo no se recrea; Todos los archivos se depositan en el directorio de extracción (por defecto, el actual). el parámetro "-d": extraer archivos en exdir
e1i45
1
@OlegVaskevich, la cuestión no solicita el nombre de archivo de destino a ser diferente
Tapemaster
Si lo se. Todavía votado. :)
Oleg Vaskevich
25

Versión más simple:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Esto volverá a crear PATH_OF_FILE_INSIDE_ARCHIVEen el directorio actual pero solo extrae el archivo especificado.

Para enumerar todos los archivos en un archivo Zip:

unzip -l ARCHIVE_NAME
Taukir
fuente
2
Mucho más simple que la respuesta aceptada.
FractalSpace
De hecho, funcionó bien y es muuuucho más simple
Mahmoud Ali
2

En macOS , que por defecto usa Info-Zip

Primero enumere los archivos para encontrar lo que desea

unzip -l my.zip

Luego proporcione una lista de archivos para extraer del archivo

unzip my.zip annoying/path/to/file

Combinar con -p para stdout

unzip -p my.zip annoying/path/to/file >./file
Cameron Lowell Palmer
fuente
1
No entiendo por qué las personas votan negativamente sin ninguna razón obvia. Esta es una respuesta correcta (no solo para macOS)
FractalSpace
@FractalSpace Es evidente que no, hace lo contrario de lo que OP quiere.
Konrad Rudolph
La clave es obtener un archivo individual. La salida a stdout y la redirección usando el indicador -p es trivial, pero lo he agregado explícitamente
Cameron Lowell Palmer
2

uso simple:

unzip zipfile.zip path/inside/zip/file.txt

e inflará el archivo.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php
Cesar Alejandro Bravo Anaya
fuente
También puede agregar el -d outpathargumento para especificar dónde se coloca el archivo.
Efren
Y el -jargumento para evitar los caminos comprimidos
Efren