我经常被 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,以检查所有压缩文件是否位于存档中的公共文件夹下。