파일 수정 날짜를 기준으로 하위 폴더를 포함한 파일을 압축하는 방법

파일 수정 날짜를 기준으로 하위 폴더를 포함한 파일을 압축하는 방법

나는 업로드 폴더(크기가 상당히 큼)를 백업하기 위해 스크립트 파일을 만드는 것을 좋아하는데, 문제는 스크립트가 매일 자정마다 백업하므로 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 파일이 되고 다음 날 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최신 데비안 버전용 패키지)

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.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

관련 정보