如何根据文件修改日期压缩文件包括子文件夹

如何根据文件修改日期压缩文件包括子文件夹

我喜欢制作一个脚本文件来备份上传文件夹(尺寸很大),问题是脚本会在每个午夜备份,所以它是相当大的 zip 文件。

3月1日

Upload
├── sub01/
│   ├── file-01.jpg (1 mar)
│   ├── file-02.jpg (1 mar)
│   ├── file-03.jpg (1 mar)
│   └── file-04.jpg (1 mar)
├── sub02/
│   ├── file-05.jpg (1 mar)
│   └── file-06.jpg (1 mar)

我想知道我们如何为每天制作一个 zip 进行备份示例第一天(例如 3 月 1 日)将是一个大 zip 文件,然后第二天将仅在 3 月 2 日创建/修改 zip 并每天保留备份。

3月2日

Upload
    ├── sub01/
    │   ├── file-01.jpg (1 mar)
    │   ├── file-02.jpg (1 mar)
    │   ├── file-03.jpg (2 mar)
    │   └── file-04.jpg (1 mar)
    ├── sub02/
    │   ├── file-05.jpg (1 mar)
    │   └── file-06.jpg (1 mar)
    └── sub03/
        ├── file-07.jpg (2 mar)
        ├── file-08.jpg (2 mar)
        ├── file-09.jpg (2 mar)
        └── file-01.jpg (2 mar)

02032022.zip包含文件

Upload
    ├── sub01/
    │   └── file-03.jpg (2 mar)
    └── sub03/
        ├── file-07.jpg (2 mar)
        ├── file-08.jpg (2 mar)
        ├── file-09.jpg (2 mar)
        └── file-01.jpg (2 mar)

我们如何制作一个脚本文件供 cron 压缩它

答案1

使用 GNU find/awk 和 bsdtar(在libarchive-tools较新版本 Debian 的软件包中)

LC_ALL=C find . -iname '*.jpg' -type f -printf '%p\0%TF\0' |
  gawk -v RS='\0' -v  ORS='\0' '
    {
      getline date
      print | "bsdtar --format zip --null -T - -cf "date".zip"
    }'

将创建一些包含在相应日期最后修改的文件YYYY-MM-DD.zip的 1 文件。jpg

请注意,它可能会并行运行许多这样的bsdtar命令。如果您的文件上次修改时间是在许多不同的日子,则可能会使您的系统不堪重负。

要仅为前一天(当地时间)最后修改的文件创建 zip 文件,您可以执行以下操作:

LC_ALL=C find . -iname '*.jpg' -daystart -mtime 1 -print0 |
  bsdtar --format zip --null -T - -cf "$(date -d yesterday +%F).zip"

这是一种比您的格式更好的格式,DDMMYYYY.zip因为它明确无误,并且意味着文件名按词法和时间顺序排序相同,但如果您坚持使用它,则可以替换%TF%Td%Tm%TY.

相关内容