Descomprimir en el directorio, independientemente de si el directorio está contenido en ZIP

Descomprimir en el directorio, independientemente de si el directorio está contenido en ZIP

Supongamos que tengo un archivo ZIP cuyo contenido puede verse así

# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml

pero también puede verse así

# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml

y ahora haría que mi script bash extraiga estos archivos, pero en cualquier caso debería extraerlos para que /var/sample/quede así:

# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml

¿Cuál es la mejor manera de hacerlo mediante un bashscript?

Por el momento estoy usando unzippara extraer archivos zip, pero estoy abierto a cualquier otra herramienta de línea de comandos, si fuera más fácil usarla.

Respuesta1

Yo sugeriría simplemente:

  • Extraer a un directorio nuevo y fresco
  • Si, después de la extracción, el nuevo directorio contiene exactamente un subdirectorio, mueva todos los archivos que contiene un nivel hacia arriba y elimine el subdirectorio original.

Por cierto, crear un archivo (tar, zip, lo que sea)sintener todos los miembros del archivo dentro de un subdirectorio esDEMONIO. ¡No sé por qué la gente lo hace!

Respuesta2

Existen varias herramientas de extracción inteligentes (que descubrí después de escribir una para mí). Es posible que desees consultar dtrx(instalar con sudo apt-get install dtrx).

dtrx siemprecrea el directorio de nivel superior si aún no está en el archivo. Adaptar su script contenedor bash (que llama dtrxen lugar de unzip) se vuelve mucho más simple ya que solo tiene que mover los subdirectorios y eliminar el directorio de nivel superior (ya que este último siempre está ahí).

información relacionada