zip命令不起作用

时间:2013-12-11 21:02:22

标签: linux shell zip winzip

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

  zip ./test/step1.zip $FILES

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

    zip warning: name not matched: myfile.dat

还有一件事我发现文件夹中文件列表中最后的文件有上述警告,而且文件没有压缩。

任何人都可以解释为什么会这样吗?我是shell脚本世界的新手。

7 个答案:

答案 0 :(得分:9)

  

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

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

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

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

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

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

:myfile.dat :

...或类似的内容,而不是:myfile.dat:,而在最后:之前没有字符

<强>更新

如果你说脚本在运行dos2unix之后就开始工作了,那就证实了每个人都怀疑的内容,那就是你的$FILES列表末尾有一个回车符。

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

答案 1 :(得分:3)

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

从手册页:

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作为存档(幸运的是)不能由普通用户写入。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

不允许使用空格:

如果$ FILES中有多个文件,它会失败,除非你把它们放在循环中

答案 5 :(得分:0)

我刚刚发现了另一个可能的原因。如果目录/子目录的权限不允许zip找到该文件,它将报告此错误。实际上,如果你在目录上运行chmod -R 444,然后尝试压缩它,你将重现这个错误,并且还有一个&#34;存储0%&#34;报告,像这样:

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

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

答案 6 :(得分:0)

我也遇到了这个问题。在我的情况下,zip脚本中的分隔线是CRLF,这会导致问题。用LF固定它。