En varias ocasiones digo que tengo a.zip
, que se descomprime sobre a/*
sí mismo.
Sin embargo, a menudo hay archivos zip que vierten todo su contenido en el directorio actual. Esto requiere que cree manualmente un director a
y lo descomprima.
Pero si como política siempre creo un directorio y el zip resulta ser del primer tipo, mi estructura parece a/a/*
no ser la ideal.
¿Hay alguna manera de descomprimirlo a.zip
independientemente a/*
de su tipo entre los dos tipos que describí anteriormente?
Respuesta1
Prueba esto:
archive="archive.zip"
has_parent=$(unzip -l "$archive" | tail -n+4 | head -n-2 | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
if test "$has_parent" -eq 1; then
unzip $archive
else
dir="./$(basename ${archive%%.zip})"
mkdir "$dir"
unzip -d "$dir" $archive
fi
Si lo usas, zipinfo
puedes apretar $has_parent
la línea a esto:
has_parent=$(zipinfo -1 "$archive" | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
La idea es simple: si hay varios archivos en el nivel raíz del archivo, obviamente destruirá su directorio actual si lo descomprime, por lo tanto, debe crear un directorio principal de antemano y descomprimir los archivos allí. De lo contrario, si todos los archivos del archivo tienen el mismo padre, entonces está bien descomprimirlos en el directorio actual.
Respuesta2
Úselo zipinfo
para mostrar contenido zip.:
$ zipinfo -1 a.zip
Sin embargo, esto probablemente no responda a su pregunta si está buscando una respuesta de automatización.
Editar:Lo que podría hacer es verificar cada línea de salida zipinfo
para ver si hay un carácter de barra diagonal. Si a una línea le falta el carácter, sabrá que se encuentra en la raíz del archivo zip.
Desafortunadamente, no puedo pensar exactamente en cómo hacer esto desde la parte superior de mi cabeza. No estoy seguro si funcionará, pero aquí hay un comando no probado:
$ MKROOT=0
$ for X in $(zipinfo -1 a.zip); do $(echo "${X}" | grep "/"); if test "$?" -gt "0"; then MKROOT=1; fi; done
$ if test "${MKROOT}" -gt "0"; then mkdir "a"; cd "a"; unzip "../a.zip"; else unzip "a.zip"; fi
Editar:La sugerencia de Mark Perryman probablemente sea mejor. Me acabo de dar cuenta de que mi comando verifica si los archivos están contenidos en subcarpetas, pero no verifica si todos están contenidos en la misma carpeta raíz.