Dependiendo de cómo se cree un archivo zip, a veces extraerá todos los archivos directamente, y a veces los extraerá en un subdirectorio.
Si esto último es cierto, ¿cómo puedo obligar al unzip
comando a "ignorar" ese directorio de primer nivel?
Ejemplo:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Lo que estoy obteniendo es /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Lo que quiero es de los archivos extraídos /tmp/omeka/
(un nivel superior y ningún número de versión incluido en la estructura del directorio)
/tmp/omeka/(files)
Sé que puedo usar la -j
opción de "rutas basura", pero quiero mantener la estructura del subdirectorio, pero no la estructura del directorio de nivel superior. ¿Cómo puedo hacer esto?
mv
los archivos, pero quería ver si había una manera de hacerlo directamente desde el comando descomprimir/wordpress/
directorio (sin número de versión) dentro del archivo zip. De hecho, está bienunzip
,mv
pero no tener control de esto y tener que hacerlo en dos pasos siempre me ha puesto un poco nervioso. Afortunadamente, Wordpress también tiene un.tar.gz
sabor :)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Respuestas:
Utilice un sistema de archivos FUSE que le permita explorar archivos como directorios, como AVFS . Use
cp
para extraer los archivos al directorio de su elección.Como suponemos que hay un único directorio de nivel superior en el archivo, puede acortar esto a
fuente
unzip
tener algo de magia para hacer esto, como especificar los archivos a extraer*/*
, que podría usar sin instalar otra utilidad, pero supongo que no. Gracias. +1Si su archivo zip no contiene estructura de directorio o no necesita preservarlo, puede usar esto:
fuente
Este script no es robusto, pero funciona en casos simples:
Simplemente verifica si hay exactamente un subdirectorio, y si es así, mueve todo hacia arriba y luego lo elimina.
fuente
Me acabo de registrar hoy, así que no puedo votar a favor de la respuesta de @SteveBennet y no puedo agregar un comentario allí.
Basado en su respuesta, creé una función recursiva como esta:
Justo como dijo @SteveBennet: este script no es robusto, pero funciona en casos simples.
Espero que sea útil.
fuente
Necesidad parece
patch --strip=n
opciónSería deseable tener una opción como
patch --strip=number
(o-pnumber
) que corte losnumber
componentes de la ruta al principio (ref. Comparación y combinación de archivos: parchear directorios ).Otra solución, aplicabilidad
De lo contrario, hay otra solución, algo hack pero funciona. En mi caso, quería sobrescribir un directorio lleno de archivos existentes con el contenido de un zip, sin extraer primero el zip completo.
Cuando esta solución funcione y la solución de @ Gilles esté disponible, esta última también funcionará. Sin embargo, esta solución no requiere la disponibilidad de un sistema de archivos FUSE.
Cómo hacerlo
Suponiendo que conoce el directorio adicional, en su caso
omeka-1.5.1
, puede hacer esto:unzip
intentará descomprimir a loomeka-1.5.1
que en realidad es un enlace simbólico para contener el directorio. Como resultado, los archivos aterrizaránomeka
directamente.Posibles variantes
Puede imaginar variantes para redirigir una o más partes de una jerarquía dependiente.
Conclusión
Esta solución es algo específica, pero tiene sus casos de uso y simplemente la usé.
fuente
unzip -l
. Esto incluso podría automatizarse utilizando un script que descubra parte de la ruta que es común.zipinfo -1
Puede ser un buen comienzo. ¿Cuál es su caso de uso?Lo más probable es que quieras correr
unzip
con la-j
opción, como en:Pero puede que te sorprenda su comportamiento:
Si extrae
files.zip
en el directorio de salida./output
y obtiene esto como resultado:entonces la
-j
opción le dará esto (todas las rutas rayadas):fuente