假如我有以下 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 z
touch 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
这不是最好的解决方案,但可以做到。如果有人有任何关于zip
(unzip
例如,不需要安装)的单行代码,请随时发布。
答案3
简单的解决方案是先删除该文件,然后再次添加它:
zip -rd /path/to/my.zip to-update.txt
zip -ru /path/to/my.zip to-update.txt
(由于我没有使用zip
,上面的命令是理论上写的。)