![zip 命令显示关于符号链接的警告“名称不匹配”,在我的工作目录之外,指向不存在的目标](https://linux22.com/image/150215/zip%20%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA%E5%85%B3%E4%BA%8E%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%9A%84%E8%AD%A6%E5%91%8A%E2%80%9C%E5%90%8D%E7%A7%B0%E4%B8%8D%E5%8C%B9%E9%85%8D%E2%80%9D%EF%BC%8C%E5%9C%A8%E6%88%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%E4%B9%8B%E5%A4%96%EF%BC%8C%E6%8C%87%E5%90%91%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E7%9B%AE%E6%A0%87.png)
压缩目录内容时出现一些奇怪的警告。我使用命令行多年来一直用于大量网站备份,但从未遇到过此类问题,我试图找出为什么会出现警告(即使 zip 文件似乎创建正确),但我无法在合理的时间(我已经把我发现的内容放在了,继续阅读)。
我进入要备份到 zip 文件的目录:
cd /home/mickoz/michael.muryn.name
这是我运行的命令(我将其定制为仅调试和重现问题):
zip -r -qv test.zip * .* -x "..*" -x test.log -x test.zip > test.log
由于某种原因,它在一开始就记录这些警告:
zip warning: name not matched: ../logs/michael.muryn.name/http.2810216.bak/html/daily.html
zip warning: name not matched: ../logs/michael.muryn.name/http.2810216.bak/html/index.html
zip warning: name not matched: ../logs/michael.muryn.name/http.2810216.bak/html/longterm.html
zip warning: name not matched: ../logs/michael.muryn.name/http.2810216.bak/html/monthly.html
zip warning: name not matched: ../logs/michael.muryn.name/http.2810216.bak/html/resources
zip warning: name not matched: ../logs/mickoz.dreamhosters.com/http.2150913.bak/html/index.html
zip warning: name not matched: ../logs/mickoz.dreamhosters.com/http.2150913.bak/html/monthly.html
zip warning: name not matched: ../logs/mickoz.dreamhosters.com/http.2150913.bak/html/resources
zip warning: name not matched: ../logs/muryn.name/http.2810083.bak/html/index.html
zip warning: name not matched: ../logs/muryn.name/http.2810083.bak/html/monthly.html
zip warning: name not matched: ../logs/muryn.name/http.2810083.bak/html/resources
zip warning: name not matched: ../muryn.name/.#svn-commit.tmp
现在,我压缩内容的目录中没有符号链接(我确实执行了一个命令来查找是否存在深层目录,但实际上没有)。
哎呀,为了确定,我什至尝试创建一个新目录 /home/mickoz/michael.muryn.name2,仅在其中创建了两个文本文件。运行我在新目录中放置的相同 zip 命令...并且出现完全相同的警告!看起来它试图在目录之外搜索,但我不明白为什么,因为我在 zip 命令中排除了“..*”,这应该可以完成这项工作。
我什至尝试在名为 /home/mickoz/testzipbackup 的目录中执行此操作,以防目录名称中的点引起问题并得到相同的结果。
知道可能是什么原因造成的吗?我该如何调试这个?
附加信息:
那里有一个符号链接
/home/mickoz/muryn.name/.#svn-commit.tmp -> [email protected]
请注意,符号链接指向不存在的东西。随着我调试的越来越多,这似乎很重要。
我删除了它并重新执行了我的 test zip 命令,这一行从日志中消失了:
zip warning: name not matched: ../muryn.name/.#svn-commit.tmp
因此,出于某种原因,它肯定会尝试在目录之外进行搜索,但我不明白为什么它只使用看起来像符号链接的内容来进行搜索,同时似乎正确地排除了文件。
从那里我深入挖掘并通过在主目录的根目录中使用以下命令搜索我的用户帐户上的所有符号链接:
find . -type l -ls
这是一个具体且有趣的结果示例:
14575211295 0 lrwxrwxrwx 1 root root 49 Aug 6 2011 ./logs/muryn.name/http.2810083 -> /home/_domain_logs/mickoz/muryn.name/http.2810083
14145610800 0 lrwxrwxrwx 1 root root 21 Aug 6 2011 ./logs/muryn.name/http.2810083.bak/access.log.0 -> access.log.2011-08-05
14145612338 0 lrwxrwxrwx 1 root root 20 Aug 6 2011 ./logs/muryn.name/http.2810083.bak/error.log.0 -> error.log.2011-08-05
15649147256 0 lrwxrwxrwx 1 root root 67 Aug 5 2011 ./logs/muryn.name/http.2810083.bak/html/daily.html -> /home/mickoz/logs/muryn.name/http.2810083/html/inactive_report.html
15649147257 0 lrwxrwxrwx 1 root root 73 Aug 5 2011 ./logs/muryn.name/http.2810083.bak/html/index.html -> /home/mickoz/logs/muryn.name/http.2810083/html/monthly/2011-08/index.html
15649147258 0 lrwxrwxrwx 1 root root 66 Aug 5 2011 ./logs/muryn.name/http.2810083.bak/html/longterm.html -> /home/mickoz/logs/muryn.name/http.2810083/html/longterm/index.html
15649147259 0 lrwxrwxrwx 1 root root 73 Aug 5 2011 ./logs/muryn.name/http.2810083.bak/html/monthly.html -> /home/mickoz/logs/muryn.name/http.2810083/html/monthly/2011-08/index.html
15649147260 0 lrwxrwxrwx 1 root root 27 Oct 19 2009 ./logs/muryn.name/http.2810083.bak/html/resources -> /home/mickoz/logs/resources
14557793344 0 lrwxrwxrwx 1 root root 49 Mar 19 15:12 ./logs/muryn.name/http -> /home/_domain_logs/mickoz/muryn.name/http.2810083
我对此进行了分析,发现只有指向不存在目标的符号链接才会出现在我的 zip 命令警告中。
现在,只需了解为什么 zip 命令在工作目录之外查找这些符号链接,并且仅对指向不存在目标的符号链接执行/发出警告。
答案1
这里发生了两件事。
第一个是
zip -r -qv test.zip * .* -x "..*" -x test.log -x test.zip
由 shell 扩展以列出所有匹配*
和 的内容.*
,其中包括..
您的情况。
第二个是zip
,当要求递归时,在过滤排除的模式之前检查给定的所有文件名;所以它看到../logs/michael.muryn.name/http.2810216.bak/html/daily.html
等并调用stat
它们,这会产生错误,并zip
输出“名称不匹配”作为结果。
避免这种情况的通常方法是指定.[^.]*
而不是.*
, 或者因为您也在匹配*
, 运行
zip -r -qv test.zip . -x test.log -x test.zip
反而。