我喜欢制作一个脚本文件来备份上传文件夹(尺寸很大),问题是脚本会在每个午夜备份,所以它是相当大的 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
.