Cómo saber de antemano si un .zip tiene un directorio principal dentro

Cómo saber de antemano si un .zip tiene un directorio principal dentro

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 ay 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.zipindependientemente 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, zipinfopuedes apretar $has_parentla 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 zipinfopara 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 zipinfopara 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.

información relacionada