Bash脚本中的Zip I/O错误:没有此文件或目录

4

我一直在编写代码,以实现对文件夹和文件进行密码保护、压缩和归档的自动化。但是,这段代码似乎不喜欢我。

我逐行运行它,但它总是在zip命令上出错,即使$file$source都是正确和有效的。

有什么想法吗?

以下是源代码:

#!/bin/bash
echo "Drag in the source file"
read source
echo

echo "Drag in the destination file, or press enter to select the Desktop"
read destination
echo

if [ -z "$destination" ]
then destination="$PWD/Desktop"
echo "Destination is set to the desktop"
fi

echo "Type the name of the file to make"
read file

if [ -z "$file" ]
then file="archive"
echo "File name set to archive.zip"
fi

file="${destination}/${file}"

if [ -d $"source" ]
then zip -erj "$file" "$destination"
else zip -ej "$file" "$destination"
fi

脚本中可能没有找到 zip 命令的路径。尝试在代码中直接指定 zip 的路径,看看是否有所帮助。如果有效,你可以在脚本中设置路径。 - John C
1
然后 destination="$PWD/Desktop" -- 这不是桌面。$PWD 是当前工作目录,它可以是任何东西。桌面是 $HOME/Desktop。这可能是错误的一个原因,因为如果目标目录不存在,zip 不会创建目标目录。此外,似乎您要求 zip 归档 $destination 而不是 $source - axiac
@axiac 谢谢!看起来问题已经解决了。也许你可以创建一个答案,这样我就可以标记它为已解决?另外,我相当确定 zip 的语法是 zip 目标 源 - Dashel Peters
1个回答

4
你的代码存在一些问题:

第一个问题是:

第二个问题是:

if [ -z "$destination" ]
then destination="$PWD/Desktop"
echo "Destination is set to the desktop"
fi

$PWD是当前工作目录。当你打开终端时,它是你的主目录,但每次运行cd时都会更改。

桌面目录是$HOME/Desktop

如果你不从主目录运行脚本,很可能$PWD/Desktop不存在,这是错误的原因;zip不会尝试为你要构建的存档创建目标目录。如果目录不存在,则会显示错误消息并退出。

另一个问题在于调用zip

if [ -d $"source" ]
then zip -erj "$file" "$destination"
else zip -ej "$file" "$destination"
fi

您可能想要存档文件$source$source目录中的文件(如果它是一个目录),但您错误地将$destination作为zip命令行中要存档的文件/目录。 if [ -d $"source" ] —— 应该是"$source",否则引号是无用的,如果$source包含空格,则脚本将以语法错误退出。
最后要注意的一点是:zip在被要求仅归档一个文件时,不介意在命令行中接收-r。您可以用一个单独的命令替换上面的整个if/else块:
zip -erj "$file" "$source"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接