Tengo una secuencia de comandos que extrae un archivo tar.gz a un subdirectorio especificado mysubfolder :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
¿Hay alguna forma equivalente de hacer esto con un archivo zip?
Respuestas:
Como dijo Mathias,
unzip
no tiene esa opción, pero un script bash de una sola línea puede hacer el trabajo.El problema es: el mejor enfoque depende de su diseño de archivo. Una solución que asume que un único directorio de nivel superior fallará miserablemente si el contenido está directamente en la raíz del archivo (piense
/a/foo
/b/foo
/foo
y el caos de la eliminación/a
y/b
).Y ocurre el mismo error con
tar --strip-component
. No existe una solución única para todos.Por lo tanto, para quitar el directorio raíz, suponiendo que no es uno (y solamente uno):
Solo asegúrese de que los archivos / directorios de segundo nivel no tengan el mismo nombre del padre de nivel superior (por ejemplo
/foo/foo
). Pero/foo/bar/foo
ya/foo/bar/bar
están bien. Si lo hacen, o si solo quieres estar seguro, puedes usar un directorio temporal para la extracción:Si está utilizando Bash, puede probar si el nivel superior es un directorio único o no:
Hablando de Bash, debe activar
dotglob
para incluir archivos ocultos, y puede envolver todo en una sola función práctica:Ahora pon eso en tu
~/.bashrc
o~/.profile
y nunca más tendrás que preocuparte por eso. Simplemente use como:(observe que se creará automáticamente
mysubfolder
para usted si no existe)fuente
No pude encontrar esa opción en las páginas del manual
unzip
, así que me temo que esto es imposible. :(Sin embargo, (dependiendo de la situación) podría solucionarlo. Por ejemplo, si está seguro de que el único directorio de nivel superior en el archivo zip se nombra
foo-
seguido de un número de versión, puede hacer algo como esto:fuente
rm -rf foo-*
a propósito, ya que eso es potencialmente peligroso. ¿Qué pasa si ya había una carpeta con nombrefoo-bar
? Tenga en cuenta que la extracción se realiza dentro de la/tmp
carpeta, que se vacía automáticamente de vez en cuando.&&
: un paso dado solo ocurre si el paso anterior fue exitoso, por lo que el último (elrm
) solo se ejecuta si todos los pasos se completaron sin error./tmp/some-hardcoded-folder-name
como carpeta temporal, sino que debe usarmktemp
para eso: garantiza que no habrá tal carpeta existente. Mira mi respuesta a continuación.Puede usar
-j
para desechar rutas (no haga directorios). Esto solo se recomienda para archivos de nivel único algo comunes. Los archivos con estructuras de directorio multinivel se aplanarán, lo que incluso podría provocar conflictos de nombres para que los archivos se extraigan.Desde la página de manual de descomprimir:
fuente