bash - 比较新旧目录并重新压缩更改的文件
问题描述
我每晚运行一个工作来生成静态网页。新文件存储在目录new
中,旧文件移动到目录old
中。生成我运行的页面后:
find new -type f -name "*.html" -exec zopfli {} \;
zopfli
提供更好的 gzip 压缩结果,但 CPU 密集度更高。因为我们谈论的是大约 30,000 页,所以这是一个问题。将它们全部压缩需要 6 个小时。
幸运的是,只有不到 1% 的静态页面实际发生了变化。所以我不必重新压缩它们。我可以将旧.gz
文件从old
目录 mv 到new
目录。.html
要查看文件是否已更改,比较文件的文件大小(old
与导向器)就足够了new
。如果它已更改,则必须对其进行压缩。有时文件被删除或生成不在old
目录中的新文件。
├── new
│ ├── a
│ │ ├── test.html
│ │ └── test2.html
│ ├── b
│ │ └── test.html
│ └── index.html
└── old
├── a
│ ├── test2.html
│ └── test2.html.gz
├── b
│ ├── test.html
│ └── test.html.gz
├── index.html
└── index.html.gz
我可以用 Ruby 或 Perl 做到这一点。但我想用 Bash shell 脚本来做。那可能吗?我该怎么做?
解决方案
用于cmp
比较文件:
find new -name '*.html' -exec sh -c '
for f; do
if cmp -s "$f" "old/${f#*/}"; then
echo cp "old/${f#*/}.gz" "${f%/*}"
else
echo zopfli "$f"
fi
done' _ {} +
如果它的输出看起来不错,请删除echo
s。
推荐阅读
- android - 不更新片段中的回收站视图
- mongodb - 匹配pymongo中两个对象数组的最佳查询
- node.js - 包括来自同一文件夹的无服务器 yml 中的排除包
- python-3.x - 为什么 /etc/rc.local 两次启动相同的 Python 脚本?
- php - PHP,如果productid在另一个页面中的每个循环中
- django - Django 管理员在生产中上传图片
- android - 如何解决谷歌播放警告“使用短信或通话记录”,
- azure - 如何使用 Azure CLI 命令获取虚拟机的公共 IP 地址
- plsql - PLSQL binary_integer 数据类型
- jenkins - 为詹金斯工作安排电子邮件通知