Debian
如何根據文件修改日期壓縮文件包含子文件夾
我喜歡製作一個腳本文件來備份上傳文件夾(大小很大),問題是腳本會在每個午夜備份,所以它是相當大的 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製作一個腳本文件來壓縮它
使用 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
的文件的 ¹ 文件。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
.