首页 > 解决方案 > 比较新旧目录并重新压缩更改的文件

问题描述

我每晚运行一个工作来生成静态网页。新文件存储在目录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 脚本来做。那可能吗?我该怎么做?

标签: bashsh

解决方案


用于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' _ {} +

如果它的输出看起来不错,请删除echos。


推荐阅读