ファイルの変更日に基づいてサブフォルダを含むファイルを圧縮する方法

ファイルの変更日に基づいてサブフォルダを含むファイルを圧縮する方法

私はアップロードフォルダ(サイズがかなり大きい)をバックアップするためにスクリプトファイルを作成するのが好きです。

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ファイルになり、翌日zipは3月2日にのみ作成/変更され、毎日バックアップを維持します。昼間。

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"
    }'

その日に最後に変更されたファイルを含む1つのファイルが作成されますYYYY-MM-DD.zipjpg

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

関連情報