/ / crear carpeta para archivo zip y extraerla - linux, shell, sed, awk, descomprimir

crear una carpeta para el archivo zip y extraerla - linux, shell, sed, awk, descomprimir

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.

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

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. Yo tambien lo intenté

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

pero el .zip la extensión de 2. $ zipfile y 4. $ zipfile deben eliminarse con sed. Si lo hago

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

no está trabajando.

¿Cómo puedo reemplazar el .zip extensión de $zipfile ¿correctamente?

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

Respuestas

36 para la respuesta № 1

"extraer aquí" es simplemente una característica de lo que sea unzip envoltura que está utilizando. unzip Sólo extraerá lo que realmente está en el archivo. Probablemente no hay una forma más sencilla que un script de shell. Pero sed, awk No son necesarios para esto si tiene un shell compatible con POSIX:

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

(NO DEBES escapar de la * o la expansión del nombre de ruta no tendrá lugar.) Tenga en cuenta que si el archivo ZIP contiene un directorio, como con los archivos de Eclipse (que siempre contiene eclipse/), terminarías con ./eclipse*/eclipse/eclipse.ini En todo caso. Añadir echo antes de unzip para un funcionamiento en seco.


79 para la respuesta № 2

unzip file.zip -d xxx extraerá los archivos al directorio xxx, y xxx se creará si no está allí. Puedes consultar la página del 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

Ver el prueba abajo,

Nota que quité |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

6 para la respuesta № 3

Si tiene p7zip, la versión de línea de comandos de 7zip instalada, entonces puede usar:

7z x "*.zip" -o"*"

1 para la respuesta № 4

aunpack from atool lo hará por defecto para todo tipo de archivos.


1 para la respuesta № 5

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

unzip -d newfolder/ zipfile.zip

zip creará la carpeta "nueva carpeta" y extraerá el archivo en ella.

Tenga en cuenta que la barra diagonal final no es necesaria, pero supongo que se debe a un hábito antiguo (uso Debian y Ubuntu).