2011-11-12 26 views
40

Si elijo un archivo zip y hago clic derecho en "extraer aquí", se crea una carpeta con el nombre de archivo zip y se extrae todo el contenido del archivo zip.crear carpeta para archivo zip y extraerla

Sin embargo, me gustaría convertir varios archivos zip a través de shell. Pero cuando lo haga

unzip filename.zip 

la carpeta "filename" no se crea, pero todos los archivos se extraen en el directorio actual.

He mirado los parámetros pero no hay tal parámetro. También probé

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done 

pero el .zip extensión del archivo zip y 2. $ $ 4. archivo zip tiene que ser eliminado con sed. Si hago

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

no está funcionando.

¿Cómo reemplazo la extensión .zip de $zipfile correctamente?

¿Hay una manera más fácil que un script de shell?

Respuesta

77

unzip file.zip -d xxx extraerá los archivos en el directorio xxx, y xxx se creará si no está allí. Puede consultar la página de manual para más detalles.

La línea de awk a continuación debe hacer el trabajo:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh 

Véase la prueba continuación,

nota que me quita |sh al final, ya que mis cremalleras son archivos falsos; Solo quiero mostrar la línea de comando generada aquí.

kent$ ls -l 
total 0 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip 

kent$ ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}' 
unzip 001.zip -d 001 
unzip 002.zip -d 002 
unzip 003.zip -d 003 
unzip 004.zip -d 004 
unzip 005.zip -d 005 
unzip 006.zip -d 006 
unzip 007.zip -d 007 
+0

Gracias, funciona como un encanto. – jack

+0

Pero lo que no entiendo es ¿por qué $ 0 contiene el nombre completo del archivo y $ 1 no la extensión ".zip"? – jack

+4

@jack Definí ".zip" como el FS (Separador de campo). Entonces 001.zip se separará en dos partes "001" y "". $ 1 es el primer campo. y $ 0 es la línea completa que en este caso es "001.zip" en awk, el campo se cuenta desde 1, no 0. – Kent

31

"extraer aquí" es simplemente una característica del envoltorio unzip que está utilizando. unzip solo extraerá lo que realmente está en el archivo. Probablemente no haya una manera más simple que un script de shell. Pero sed, awk etc., no son necesarios para este si tiene una cáscara compatible con POSIX: (. Usted no debe escapar de la * o expansión de nombres no se llevará a cabo)

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done 

Tenga en cuenta que si el archivo ZIP contiene un directorio, como con los archivos de Eclipse (que siempre contienen eclipse/), en cualquier caso terminaría con ./eclipse*/eclipse/eclipse.ini. Agregue echo antes de unzip para un funcionamiento en seco.

+0

Gracias por la información. – jack

+2

@jack, ESTA respuesta debe ser la respuesta de aceptación. NO deberías usar la salida 'ls' para nada. 'ls' es una herramienta para buscar interactivamente los metadatos del directorio. Cualquier intento de analizar la salida 'ls' con el código está roto. Los Globs son mucho más simples Y correctos: 'para el archivo en * .zip'. Lea [Parsing ls] (http://mywiki.wooledge.org/ParsingLs) –

6

Si tiene p7zip, la versión de línea de comandos de 7zip instalado, entonces usted puede utilizar:

7z x '*.zip' -o'*' 
1

aunpack de atool va a hacer esto por defecto para todo tipo de archivos.

Cuestiones relacionadas