zip 命令不起作用

问题描述 投票:0回答:8

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

  zip ./test/step1.zip $FILES

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

    zip warning: name not matched: myfile.dat

我还观察到,最后位于文件夹中的文件列表中的文件有上述警告,并且该文件没有被压缩。

谁能解释一下为什么会发生这种情况?我是 shell 脚本世界的新手。

linux shell zip winzip
8个回答
11
投票

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

这意味着文件

myfile.dat
不存在。

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

正如您所说,无论

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

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

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

:myfile.dat :

...或者类似的东西,而不是最后一个

:myfile.dat:
 之前没有字符的 
:

更新

如果你说脚本在运行

dos2unix
后开始工作,这证实了每个人都已经怀疑的事情,不知何故在你的
$FILES
列表末尾有一个回车符。

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


5
投票

产生

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

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


1
投票

eebbesen在他对我的案件的评论中击中要害(但我不能投票赞成评论)。 其他评论中遗漏的另一个可能原因是文件超出文件大小限制(4GB)。


1
投票

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


0
投票

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

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

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


0
投票

不允许有空格:

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


0
投票

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


0
投票

虽然标题很大,但在尝试压缩由

Warning
创建的项目时,我遇到了类似的
docker-compose.yml
问题,其中 mysql 的数据保存为我的项目文件夹中的文件夹。

当我尝试压缩时,它给出了相同的错误,但 zip 可以创建一个包含除

mysql.sock
之外的所有文件的存档。虽然该文件存在,但 zip 无法压缩它。这是因为该文件正在被mysql使用并不断被红色/写入并且它受到保护。

因此,每当您尝试压缩此类文件时,您都会得到该结果

warning
。因此,请尝试找到此类文件,如果不需要它们,请将其排除。

就我而言,我做到了

zip -rq .... -x '**/mysql.sock'
并且成功了。

© www.soinside.com 2019 - 2024. All rights reserved.