15

我正在尝试使用 shell script 命令压缩文件。我正在使用以下命令:

  zip ./test/step1.zip $FILES

其中 $FILES 包含所有输入文件。但我收到如下警告

    zip warning: name not matched: myfile.dat

我观察到的另一件事是,最后在文件夹中的文件列表中的文件具有上述警告,并且该文件没有被压缩。

谁能解释我为什么会这样?我是 shell 脚本世界的新手。

4

7 回答 7

11

zip 警告:名称不匹配:myfile.dat

这意味着该文件myfile.dat不存在。

如果文件是指向不存在文件的符号链接,您将收到相同的错误。

正如您所说,无论 of 的最后一个文件是什么$FILES,它都不会与警告一起添加到 zip 中。所以我认为你的创作方式有问题$FILES。最后一个文件名的末尾可能有换行符、回车符、空格、制表符或其他不可见字符,导致某些内容不存在。试试这个例如:

for f in $FILES; do echo :$f:; done

我敢打赌最后一行是不正确的,例如:

:myfile.dat :

...或类似的东西,而不是:myfile.dat:在最后一个之前没有字符:

更新

如果您说脚本在运行后开始工作,这证实了每个人已经怀疑的事情,即不知何故在您的列表dos2unix末尾有一个回车。$FILES

od -c显示 \r 回车。尝试echo $FILES | od -c

于 2013-12-11T21:05:23.227 回答
5

另一个可能产生zip warning: name not matched:错误的原因是zip's 的任何环境变量设置不正确。

从手册页:

ENVIRONMENT
    The following environment variables are read and used by zip as described.

ZIPOPT
    contains default options that will be used when running zip.  The contents of this environment variable will get added to the command line just after the zip command.

ZIP
    [Not on RISC OS and VMS] see ZIPOPT

Zip$Options
    [RISC OS] see ZIPOPT

Zip$Exts
    [RISC OS] contains extensions separated by a : that will cause native filenames with one of the specified extensions to be added to the zip file with basename and extension swapped.

ZIP_OPTS
    [VMS] see ZIPOPT

在我的例子中,我zip在脚本中使用并将二进制位置放在环境变量ZIP中,这样我们就可以zip轻松地更改为不同的二进制文件,而无需在脚本中进行大量更改。

例子:

ZIP=/usr/bin/zip
...
${ZIP} -r folder.zip folder

然后将其处理为:

/usr/bin/zip /usr/bin/zip -r folder.zip folder

并产生错误:

zip warning: name not matched: folder.zip
zip I/O error: Operation not permitted
zip error: Could not create output file (/usr/bin/zip.zip)

第一个是因为它现在正试图添加folder.zip到存档中,而不是将其用作存档。第二个和第三个是因为它试图将文件/usr/bin/zip.zip用作普通用户不可写的存档(幸运的是)。

注意:这是一个非常古老的问题,但我在任何地方都没有找到这个答案,所以我发布它是为了帮助未来的搜索者(包括我未来的自己)。

于 2017-04-03T01:11:06.340 回答
1

eebbesen在他对我案子的评论中一针见血(但我不能投票支持评论)。其他评论中遗漏的另一个可能原因是文件超出了文件大小限制(4GB)。

于 2015-04-07T14:42:12.143 回答
1

我使用 dos2unix 命令将我的脚本转换为 unix 环境,并将我的脚本执行为 ./myscript.sh 而不是 bash myscript.sh。

于 2013-12-11T22:23:37.237 回答
0

我刚刚发现了另一个潜在的原因。如果目录/子目录的权限不允许zip找到文件,就会报这个错误。实际上,如果您在目录上运行 chmod -R 444,然后尝试对其进行压缩,您将重现此错误,并且还会出现“已存储 0%”的报告,如下所示:

zip 警告:名称不匹配:borrar/enviar 添加:borrar/(已存储 0%)

因此,尝试更改文件的权限。如果您尝试通过电子邮件发送它们,并且那些电子邮件过滤器(如 Gmail)发明了不发送可执行文件的愚蠢过滤器,请不要忘记在进行 zip 压缩时使权限非常严格可能是您报告错误的原因, “名称不匹配”。

于 2014-09-29T14:56:38.420 回答
0

不允许有空格:

如果 $FILES 中有多个文件,它将失败,除非您将它们放入循环中

于 2014-04-18T00:21:33.960 回答
0

我也遇到了这个问题。就我而言,在我的 zip shell 脚本中,单独的行是 CRLF,这会导致问题。使用 LF 修复它。

于 2020-04-11T05:58:39.947 回答