Descomprima el contenido del archivo, pero sin crear una carpeta de archivo

37

Tengo un archivo myarchive.zip que contiene muchos directorios, archivos, etc. Digamos que este archivo myarchive.zip vive en un directorio llamado "b". Bueno, cuando uso el comando "descomprimir myarchive.zip", el sistema crea un directorio por defecto llamado "myarchive" con el contenido del archivo zip. Yo no quiero que el sistema cree este directorio "miarchivo" - Sólo quiero que el contenido se extraen en el directorio "b". es posible?

Lo que he estado haciendo ahora es simplemente emitir un comando "cp" para copiar los archivos del directorio recién creado (en este caso, "myarchive" a "b") donde los quiero.

ScoobaSteve
fuente
8
Por defecto, unzipno crea un directorio. Su archivo zip probablemente tenga el directorio en su nivel superior.
Chris Down
3
Podrías usar en mvlugar de cp. mv archive/* .; rmdir archive/o similar.
frostschutz

Respuestas:

45

Mi versión de unziptiene una -jopción para no crear ningún directorio.

Asi que

unzip -j /path/to/file.zip

Extraerá todos los archivos en el directorio actual sin restaurar la estructura de directorios almacenada en el ziparchivo.

Si solo desea eliminar un nivel de directorios del archivo (extraer myarchive/dir/filecomo dir/file, no file), puede usar bsdtar(que admite ziparchivos además de tararchivos) en su lugar y su -sopción.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Stéphane Chazelas
fuente
8
Cuando se utiliza -jla estructura del directorio de archivo no se recrea y todos los archivos se depositan en la carpeta de extracción. Esto significa que TODAS las subcarpetas se descartan. Entonces, si lo hubiera hecho zip/A/f1, zip/A/B/f2y zip/A/B/C/f3terminaría con una sola carpeta con f1, f2, f3. Se vuelve funky si tiene archivos con el mismo nombre en diferentes subcarpetas. Por lo general, solo desea soltar la carpeta superior, no toda la estructura del directorio.
Cristian Vrabie
3
@CristianVrabie, bueno, eso es exactamente lo que digo en la respuesta. He agregado una alternativa bsdtar para lo que estás preguntando. Ver editar.
Stéphane Chazelas
3

Parece que esto es realmente simple con bsdtar :

bsdtar --strip-components=1 -xvf file.zip

ismail
fuente
1

Lo que la respuesta aceptada no especifica cómo hacer, como usted dice en la pregunta, si aún desea extraer a una carpeta específica sin usar las rutas de las carpetas almacenadas en los archivos zip, puede usar la -jopción con -dopción de esta manera :

unzip -j /path/to/file.zip -d other_folder

o para tu caso

unzip -j myarchive.zip -d b
Eduard Florinescu
fuente
2
Tienes razón en que puedes hacer eso; pero no creará los subdirectorios, por lo que aún debe incorporar otro paso; Estoy bastante seguro de que el OP quiere cambiar el nombre del directorio raíz del archivo a otro nombre, pero mantener la estructura restante bajo ese directorio.
Pryftan
-1

Si realizar unzip myarchive.zipproduce un directorio myarchivecon todo lo que contiene, eso significa que el creador del archivo zip realmente realizó zip en ese directorio.

La única forma de crear lo que desea es mover todo el contenido fuera del directorio después de realizar unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ muestra el directoriomyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ muestra el primer nivel de myarchive (directamente en b) }

toinetoine
fuente
1
También necesita un mv myarchive/.* .para mover todos los archivos ocultos como .gitignore y .htaccess.
Kinjal Dixit
1
@KinjalDixit Ese fue mi pensamiento también; Antoine hay un defecto fatal en tu ejemplo como señala Kinjai: porque usas rm -Ry porque no estás usando, ls -ano estás mostrando si hay archivos de puntos; ahora, ¿qué sucede cuando corres rm -Ry hay archivos de puntos? No los has copiado, así que están perdidos. Realmente deberías arreglar eso y tal vez explicar la diferencia porque es algo que hará tropezar bastante a los novatos; y considere esto: ¿qué pasa si no es un archivo que tienen? ¿O qué pasa si agregan al comando para eliminar el archivo una vez que está descomprimido?
Pryftan
Otoh rmdirse aseguraría de que esté vacío primero ... Pero si el usuario no sabe acerca de los archivos de puntos, los confundiría.
Pryftan