zip命令不起作用

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

zip ./test/step1.zip $FILES 

$ FILES包含所有的input文件。 但是我得到如下警告

  zip warning: name not matched: myfile.dat 

还有一件事我观察到文件夹中最后一个文件列表中的文件有上面的警告,那个文件没有被压缩。

任何人都可以解释为什么发生这种情况? 我是新的shell脚本世界。

Solutions Collecting From Web of "zip命令不起作用"

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

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

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

就像你说的那样,无论是$FILES的最后一个文件,它都不会和警告一起被添加到zip中。 所以我认为你创建$FILES的方式是错误的。 机会是在最后一个文件名的末尾有换行符,回车符,空格,制表符或其他不可见的字符,导致不存在的东西。 试试这个例子:

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

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

 :myfile.dat : 

…或类似的东西,而不是:myfile.dat:最后没有字符:

UPDATE

如果你说这个脚本在运行dos2unix之后就开始工作了,这就证实了每个人都已经怀疑的东西了,不知何故在$FILES列表的末尾有一个回车符。

eebbesen在他评论我的情况下(但我不能投票发表评论)。 其他评论中遗漏的另一个可能的原因是文件超过了文件大小限制(4GB)。

另一个可能的原因,可能会产生一个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作为(幸运的是)不能由普通用户写入的存档。

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

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

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

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

不允许有空格:

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

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