bash скрипт для удаления папок с name_date старше 90 дней - PullRequest
1 голос
/ 28 мая 2020

У меня есть папка с большой историей данных

data/
  2010.01.01/
    f1/
    f2/
    ...
  2010.01.02/
    ...
  ...

, и я хотел бы иметь еще одну папку только с папками, которые имеют имя с датой за последние 90 дней

data_recent/
  2020.02.28/
    f1/
    f2/
    ...
  ...  
  2020.05.28/
    ...

как проще всего синхронизировать c новые папки и удалить старые с помощью сценария bash? Коробка работает на centos7

1 Ответ

3 голосов
/ 28 мая 2020

Ключ состоит в том, чтобы преобразовать имена папок с датами в Unix эпоху, чтобы вы могли легко их сравнить.

#!/bin/bash

dataDir="/abs/path/to/data"
recentDir="/abs/path/to/data_recent"
daysToKeep=90
minKeepEpoch=$(date --date "$daysToKeep days ago" +%s)

# Create new links for folders that are within $daysToKeep
while IFS= read -r -d $'\0' dir; do
  dirName=${dir##*/}
  dirEpoch=$(date --date ${dirName//./} +%s)
  (( dirEpoch >= minKeepEpoch )) && ln -s -t "$recentDir" "$dir"
done < <(find "$dataDir" -mindepth 1 -maxdepth 1 -type d -print0)

# Remove links that are older than $daysToKeep    
while IFS= read -r -d $'\0' link; do
  linkName=${link##*/}
  linkEpoch=$(date --date ${linkName//./} +%s)
  (( linkEpoch < minKeepEpoch )) && rm "$link"
done < <(find "$recentDir" -mindepth 1 -maxdepth 1 -type l -print0)

Proof of Concept

Обратите внимание, что ./data_recent был предварительно заполнен устаревшей ссылкой, которая будет удалена

$ tree ./data
./data
├── 2010.01.01
│   ├── f1
│   └── f2
├── 2020.02.27
│   ├── f1
│   └── f2
├── 2020.02.28
│   ├── f1
│   └── f2
├── 2020.05.27
└── 2020.05.28
    └── f1

12 directories, 0 files

$ tree ./data_recent/
./data_recent/
└── 2010.01.01 -> /abs/path/to/data/2010.01.01

1 directory, 0 files

$ ./syncFolders.sh
$ tree ./data_recent/
./data_recent/
├── 2020.05.27 -> /abs/path/to/data/2020.05.27
└── 2020.05.28 -> /abs/path/to/data/2020.05.28

2 directories, 0 files
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...