bash脚本,用于删除名称为\u日期早于90天的文件夹

bash脚本,用于删除名称为\u日期早于90天的文件夹,bash,Bash,我有一个包含大量数据历史记录的文件夹 data/ 2010.01.01/ f1/ f2/ ... 2010.01.02/ ... ... 我希望有另一个文件夹,其中只包含名称和日期在过去90天内的文件夹 data_recent/ 2020.02.28/ f1/ f2/ ... ... 2020.05.28/ ... 用bash脚本同步新文件夹和删除旧文件夹最简单的方法是什么? 该框在centos7上运

我有一个包含大量数据历史记录的文件夹

data/
  2010.01.01/
    f1/
    f2/
    ...
  2010.01.02/
    ...
  ...
我希望有另一个文件夹,其中只包含名称和日期在过去90天内的文件夹

data_recent/
  2020.02.28/
    f1/
    f2/
    ...
  ...  
  2020.05.28/
    ...
用bash脚本同步新文件夹和删除旧文件夹最简单的方法是什么?
该框在centos7上运行

关键是将日期文件夹名称转换为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)

关键是将日期文件夹名称转换为Unix Epoch time,以便您可以轻松地进行比较

#!/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)

我要做的就是创建到文件夹的软链接,这些文件夹的名称在data\u recent/中的日期小于90天。ln-s。然后,只需在data/中的新目录上循环,并在data\u recent/中添加新链接,在data\u recent/中循环链接,并删除任何超过90天的链接。在这两种情况下,您都可以解析目录名,然后使用date-d文件夹_date+%s创建一个以秒为单位的日期(从历元算起)。您将获得90天前的秒数,日期为-d 90天前+%s数据的时间不一定与文件夹名称中的日期对应。因此,可以稍后重新生成一些数据,从而删除并重新创建主文件夹。这就是为什么要将文件夹名称解析为日期,而不是使用find data/-type f-newermt$date-d 90天前+%f%R:-我要做的是在data\u recent/中创建到名称日期小于90天前的文件夹的软链接。ln-s。然后,只需在data/中的新目录上循环,并在data\u recent/中添加新链接,在data\u recent/中循环链接,并删除任何超过90天的链接。在这两种情况下,您都可以解析目录名,然后使用date-d文件夹_date+%s创建一个以秒为单位的日期(从历元算起)。您将获得90天前的秒数,日期为-d 90天前+%s数据的时间不一定与文件夹名称中的日期对应。因此,可以稍后重新生成一些数据,从而删除并重新创建主文件夹。这就是为什么您将文件夹名称解析为日期,而不是使用find data/-type f-newermt$date-d 90天前+%f%R:-非常感谢您的回答非常感谢您的回答