Zip 文件夹,不包含文件夹路径,只需要一个参数

Dus*_*ran 6 scripting zsh zip

我正在尝试制作一个 zip 函数,它可以执行我在压缩文件或文件夹时通常执行的所有步骤。假设我当前的目录是~,我想压缩一个名为Folder1的文件夹,其文件路径是~/Folder2/Folder1.

发行

cd ~/Folder2 && zip -r Folder1 Folder1 && cd -
Run Code Online (Sandbox Code Playgroud)

正是我想要的。即,它进行Folder1.zip压缩,以便输出不包含通向我正在压缩的文件夹(即/home/user/Folder2)的文件夹,它递归地压缩,并且它采用 zip 的第一个参数,其名称与我正在压缩的文件或文件夹的确切名称相同正在压缩 ( Folder1.zip)。

所以我想在我的.zshrc东西中创建一个类似于

coolerzip() { cd /path/to/file && zip -r file file && cd - }
Run Code Online (Sandbox Code Playgroud)

它只需要接受一个参数,在这种情况下,它将是~/Folder2/Folder1。然后Folder1将是两个files in的名称coolerzip,我将在压缩之前cd直接进入当前目录中的~/Folder2so 位置Folder1。有什么方法可以实现这一点,以便coolerzip只需要一个参数而不是三个参数?

Gil*_*il' 1

该函数的参数是$1

您可以使用历史扩展修饰符来提取目录部分和路径的最后一个组成部分:if 参数是~/directory2/directory1then $1:his~/directory2$1:tis directory1。(助记:head 和tail。)

在函数体周围使用括号而不是大括号。这样函数体运行在子shell(一个单独的shell进程)中,变量赋值、目录更改等只影响子shell。

coolerzip () (
    cd $1:h &&
    zip -r $2:h.zip $2:h
)
Run Code Online (Sandbox Code Playgroud)

其他 shell 没有历史扩展修饰符,因此您需要不同的东西来解析参数。对于文件名,${1##*/}去掉所有前导目录组件;但是,如果参数中有尾部斜杠,则此方法不起作用,而"$(basename -- "$1")"在这种情况下则有效。对于主要目录,请使用$(dirname -- "$1"). 请注意,在 zsh 以外的 shell 中,您需要在变量替换两边加上双引号

coolerzip () (
    name="$(basename -- "$1")"
    cd "$(dirname -- "$1")" &&
    zip -r "$name.zip" "$name"
)
Run Code Online (Sandbox Code Playgroud)