Si elijo un archivo zip y haga clic en «extraer aquí» una carpeta con el nombre del archivo zip se crea y todo el contenido del archivo zip se extrae en ella.

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

unzip filename.zip

la carpeta "filename" no es creado, sino todos los que se extraen los archivos en el directorio actual.

He mirado en los parámetros pero que no existe ningún parámetro.
También traté de

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

pero la .zip extensión de la 2. $fichero zip y 4. $fichero 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 puedo reemplazar el .zip extensión de $zipfile correctamente?

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

InformationsquelleAutor creativeDev | 2011-11-12

5 Comentarios

  1. 43

    de»extraer aquí» es simplemente una característica de lo que unzip contenedor que está utilizando. unzip sólo extracto de lo que en realidad está en el archivo. Probablemente no hay manera más sencilla de un script de shell. Pero sed, awk etc. no son necesarios para esta si tiene un compatibles con POSIX shell:

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

    (NO DEBE escapar de la * o la ruta de acceso de expansión no tendrá lugar.) Tenga en cuenta que si el archivo ZIP contiene un directorio, como con Eclipse archivos (que siempre contienen eclipse/), que terminaría con ./eclipse*/eclipse/eclipse.ini en cualquier caso. Agregar echo antes de unzip para un funcionamiento en seco.

    • Gracias por la info.
    • ESTA respuesta debe ser la de aceptar la respuesta. Usted NO debe USAR ls de salida para nada. ls es una herramienta interactiva que buscan en el directorio de metadatos. Cualquier intento de análisis ls de salida con el código está roto. Globs es mucho más simple Y correcta: for file in *.zip. Leer el Análisis de ls
    • Nota: puede usted mejorar su respuesta (que absolutamente respuestas a la pregunta original, de cómo extraer múltiples archivos zip en el dedicado fodlers) con el caso «cómo crear carpeta para extraer un único archivo zip en él?»
    • Por favor, ¿por qué este trabajo de alias unzipd=’función uzd() { args=(«[email protected]») for f in «${args[@]}»; do echo «——- $f ———-» descomprimir $f -d «${f%*.zip}» done } uzd ‘ y no alias unzipd=’ args=(«[email protected]») for f in «${args[@]}»; do echo «——- $f ———-» descomprimir $f -d «${f%*.zip}» done » (¿por Qué los alias no puede manejarlo ?) erro: error de sintaxis cerca de token //comentario: son las multilíneas
    • y como situados aquí stackoverflow.com/a/7131683/7668448, es decir alias no toma parámetros directamente y función, pero yo siempre uso las cosas como gipsh=»git push origin [email protected]». ¿Cuál es la diferencia de alrededor de [email protected] ?
    • tengo la respuesta (a la mitad), no tenía una buena concepción de cómo alias de trabajo, sólo el trabajo como una inclusión en c/c++, cualquiera que sea el nombre de alias de espera, se copiarán en su lugar, y si [email protected], $1 .. es escrito, al final (o en cualquier lugar), es omitido, de modo ex: alias lsg='ls | grep ' y, a continuación,lsg zip, que será el equivalente de ls | grep zip. Y alias ech='echo "$1" ' y ech ok yes again | se espera que ok sólo show, pero el resultado es, como «$1» no existe. Es igual que en la variable son ignorados. Si alguno puede explicar más volverá a ser grande. Ty mucho.
    • Por favor, hacer una nueva pregunta.

  2. 84

    unzip file.zip -d xxx que va a extraer los archivos en el directorio de xxx y xxx se crea si no existe. Puede comprobar el hombre de la página para más detalles.

    El awk línea de abajo debe hacer el trabajo:

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

    Ver el prueba a continuación,

    nota que me quitaron |sh al final, desde mi cremalleras son falsos los archivos; sólo quiero mostrar el generado de la línea de comandos 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
    • Gracias, funciona como un encanto.
    • Pero lo que yo no entiendo es por qué $0 contiene el nombre de archivo completo y de $1 no «.zip» extensión?
    • He definido «.zip» como el FS (Field Separator). Así 001.zip será dividida en dos partes «001» y «». $1 es el 1 de campo. y $0 es el conjunto de la línea, que en este caso es «001.zip» en awk, el campo empieza a contar desde 1, no 0.
    • Pero si xxx es anidada ruta de acceso del directorio, se producirá un error y el problema de «no se puede crear el directorio de extracción de los mensajes». Por supuesto que puedo escribir un shell y comprobar si el directorio intermedio existe, crearlo de antemano) pero me gustaría hacerlo de una sola vez con solo descomprimir comando.
    • Este comando es grande, pero no funcionará si no hay espacios en el nombre de archivo. Para dar cuenta de los espacios, deberá ejecutar ls *.zip | awk -F'.zip' '{print "unzip \""$0"\" -d \""$1"\""}' | sh
    • Uno no se supone que analizar ls salida. No funciona en mi sistema porque ls ha -lah habilitado de forma predeterminada. ls es una herramienta interactiva. Uso de la ruta de expansión.
    • NO UTILICE ls de salida para nada. ls es una herramienta interactiva que buscan en el directorio de metadatos. Cualquier intento de análisis ls de salida con el código está roto. Globs es mucho más simple Y correcta: for file in *.txt. Leer mywiki.wooledge.org/ParsingLs

  3. 8

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

    7z x '*.zip' -o'*'
  4. 5

    Agregar el nombre de la carpeta y la barra después del interruptor, por ejemplo:

    unzip -d newfolder/ zipfile.zip

    zip va a crear la carpeta «newfolder» y extraer el archivo en ella.

    Tenga en cuenta que la barra al final, no es necesario, pero supongo que es sólo desde antiguo la costumbre (yo uso Debian y Ubuntu).

Dejar respuesta

Please enter your comment!
Please enter your name here