如何让 zip 更新档案中的文件,即使文件系统上的文件较旧

如何让 zip 更新档案中的文件,即使文件系统上的文件较旧

假如我有以下 zip 文件:

my.zip
|- folder
|  `- to-update.txt
`- some-other-file.txt 

以及文件夹结构:

working-directory
`- folder
   `- to-update.txt

我希望将文件to-update.txt从我的工作目录复制到 zip 中。为此,我将使用:

# Currently in working-directory
zip -ru /path/to/my.zip .

然而,如果my.zip的副本to-update.txt较新,则此方法将不起作用,并且会压缩输出(带有-v):

zip 诊断:folder/最新
zip 诊断:folder/to-update.txt最新

我怎样才能让它覆盖文件系统/工作目录中的任何文件(并且仍然添加新文件),即使它们具有较旧的时间戳?

不像文件同步选项,我不想删除丢失的文件,所以some-other-file.txt应该保持不变。

答案1

只需将文件重新添加到档案中即可实现此目的:

zip -r my.zip .

-u仅当文件较新时才执行相同操作。

答案2

我的(黑客)解决方案是更改/更新文件的时间戳。因为它在 Docker 容器中,所以我们可以忍受它。

触摸,构建于这些 解决方案

find working-directory -mindepth 1 -exec touch -m {} +
  • -mindepth忽略工作目录:.
  • -m只改变修改时间戳,保留访问时间戳
  • +而不是和的\;区别touch -m x y ztouch x && touch y && touch z

但是,由于我在使用 Docker,因此我没有这些文件的写权限,因此必须在压缩它们之前复制它们:

cp -r working-directory /tmp/working-directory/
(cd /tmp/working-directory && zip -ru /path/to/my.zip .)
rm -rf /tmp/working-directory

这不是最好的解决方案,但可以做到。如果有人有任何关于zipunzip例如,不需要安装)的单行代码,请随时发布。

答案3

简单的解决方案是先删除该文件,然后再次添加它:

zip -rd /path/to/my.zip to-update.txt
zip -ru /path/to/my.zip to-update.txt

(由于我没有使用zip,上面的命令是理论上写的。)

相关内容