如何将文件(例如:foo.zip
)解压缩到同名文件夹(foo/
)?
基本上,我想创建一个 unzip 别名,将文件解压缩到具有相同名称的文件夹(而不是当前文件夹)中。这就是 Mac 的解压缩实用程序的工作原理,我想在 CLI 中执行相同的操作。
答案1
我用unar
为了这;默认情况下,如果存档包含多个顶级文件或目录,它会创建一个目录来存储提取的内容,并按照您描述的方式以存档命名:
unar foo.zip
您可以使用以下选项在所有情况下强制创建目录-d
:
unar -d foo.zip
或者,函数可以通过以下方式执行此操作unzip
:
unzd() {
if [[ $# != 1 ]]; then echo I need a single argument, the name of the archive to extract; return 1; fi
target="${1%.zip}"
unzip "$1" -d "${target##*/}"
}
这
target=${1%.zip}
line 删除.zip
扩展名,不考虑其他任何内容(因此foo.zip
变为foo
,并~/foo.zip
变为~/foo
)。这
${target##*/}
参数扩展删除最后的所有内容/
,就~/foo
变成了foo
。这意味着该函数将任何.zip
文件提取到当前目录中以其命名的目录中。unzip $1 -d "${target}"
如果您想将存档解压到与其并排的目录中,请使用此选项。
unar
适用于 macOS(及其 GUI 应用程序,解档者)、Windows 和 Linux;它被打包在许多发行版中,例如 unar
在 Debian 及其衍生品、Fedora 及其衍生品、community/unarchiver
Arch Linux 中。
答案2
这是另一种变体,可以使用 1-liner 来处理当前目录中的多个 zip 文件:
for f in *.zip; do unzip "$f" -d "${f%.zip}"; done
对于仅一个文件(即在函数中使用),它将是:
unzip "$1" -d "${1%.zip}"
答案3
使用unzip -d exdir zipfile.zip将 zip 文件解压到特定目录中。原则上,从字面上阅读你的文章,你可以编写这样的函数:
unzip_d () {
unzip -d "$1" "$1"
}
既然你想要。压缩尽管删除了扩展名,您可以使用特殊的变量语法来做到这一点:
unzip_d () {
zipfile="$1"
zipdir=${1%.zip}
unzip -d "$zipdir" "$zipfile"
}