Debian

如何根據文件修改日期壓縮文件包含子文件夾

  • April 18, 2022

我喜歡製作一個腳本文件來備份上傳文件夾(大小很大),問題是腳本會在每個午夜備份,所以它是相當大的 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.

引用自:https://unix.stackexchange.com/questions/699437