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 bash
script?
Por el momento estoy usando unzip
para 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 dtrx
en 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í).