如何知道 zip 文件是否有根文件夹?

如何知道 zip 文件是否有根文件夹?

我经常被 zip 文件(库、程序、...)所欺骗。

有时,我会很谨慎,并且会这样做:

$ mkdir content && cd content
$ unzip ../library.zip
Archive: library.zip
 creating: library/
inflating: library/foo.c
...
$ # Grumble...
$ mv library/* .
$ rmdir library

有时我会变得懒惰,我只是做...

$ cd
$ unzip ../library.zip
Archive: library.zip
 creating: config/
inflating: config/...
 creating: lib/
 creating: bin/
 creating: ...
...
$ # Grumble...
$ mkdir library
$ mv config library
$ mv lib library
$ mv bin library
$ # ...

有没有一种通用的方法来解压 zip 文件而不会陷入这些问题?

答案1

我同意这非常烦人。我认为unzip应该开箱即用。这是一个可以完成这项工作的脚本(我称之为unzipd)。

#!/usr/bin/env bash

# Exit on any error
set -e

# Check we have at least one argument
if [ $# -ne 1 ]; then
  echo "Missing zip filename parameter"
  exit 2
fi

zip="$1"
# Get filename only (no path)
zipfile=${zip##*/}
# Get file base namem (no extension)
zipbase=${zipfile%%.*}

# Make a tmp dir in the current dir
tmpdir=$(mktemp -d -p . -t "$zipbase.XXXX")

# Unzip into the tmp directory
/usr/bin/unzip -d "$tmpdir" ${@:1:$(($#-1))} "$zip"

# Check number of files in the tmp dir
if [ "$(ls -1 "$tmpdir" | wc -l)" -eq 1 ]; then
  # If there's only 1 file in the tmp, move it up a level
  mv "$tmpdir"/* .
  # Get rid of tmp dir
  rmdir "$tmpdir"
else
  # If more then 1 file, just rename the tmp dir based on the zip filename
  mv "$tmpdir" "$zipbase"
fi

答案2

在解压之前,您可以先使用带有选项 -l 的 unzip,以检查所有压缩文件是否位于存档中的公共文件夹下。

相关内容