Linux,shell script]如何通过按文件夹名称搜索来动态删除文件夹



我使用的是centOS8,我正在编写一个批处理脚本来删除前一天的数据。

需要删除的文件夹的结构如下。

root/data/year/month/day/uuid/time

例如:

root
└ data
└ ImportantFolder
└ 2020
└ 2021
└ 11
└ 12
└ 1
└ 2
└ 550e8400-e29b-41d4-a716-446655440000
└ 2243010332.d     

该脚本每天凌晨2:00运行,应该只删除前一天的数据。

例如,如果今天是2022年1月1日,则应删除截至2021年12月31日的文件夹。

只删除数据文件夹中一天前创建的文件很简单,但删除的数据不在年/月/日之后。。数据文件夹中的结构(如上面的ImportantFolder(不应被删除,并且只应保留午夜之后创建的文件夹。(系统全天候工作(

因此,当执行脚本时,我在想是否可以获得昨天的日期,分解日期、月份和年份,然后通过条件语句将其删除。我刚接触shell脚本,所以我不知道这是否可能。你能帮我想出一个更好的主意吗?或者我如何用脚本获取和分解前一天的内容?


我参考答案中的指南编写的脚本如下。这是一个初学者的脚本,但我希望它能帮助到别人。

#!/bin/bash
function rm_Ymd_forder(){
current_year=$(($(date +%Y)))
current_month=$(($(date +%m)))
current_day=$(($(date +%d)))
base_dir=/data
for current_dir in "$base_dir"/*/; do
current_dir=$(basename "$current_dir")
if [ "$current_dir" -lt "$current_year" ];
then
rm -rf "$base_dir"/"$current_dir"
echo "$base_dir"/"$current_dir" "Deleted"
fi;
done
for current_dir2 in "$base_dir"/"$current_year"/*/; do
current_dir2=$(basename "$current_dir2")
if [ "$current_dir2" -lt "$current_month" ];
then
rm -rf "$base_dir"/"$current_year"/"$current_dir2"
echo "$base_dir"/"$current_year"/"$currnet_dir2" "Deleted"
fi;
done
for current_dir3 in "$base_dir"/"$current_year"/"$current_month"/*/; do
current_dir3=$(basename "$current_dir3")
if [ "$current_dir3" -lt "$current_day" ];
then
rm -rf "$base_dir"/"$current_year"/"$current_month"/"$current_dir3"
echo "$base_dir"/"$current_year"/"$current_month"/"$current_dir3" "Deleted"
fi;
done
}
(
set -e
rm_Ymd_forder
)
errorCode=$?
if [ $errorCode -ne 0 ]; then
echo "Error"
exit $errorCode
else
echo "OK"
exit 0
fi

以下是一些指南:

  1. 使用GNU日期获取各种日期段
    • 示例:current_year=$(date +%Y)将为您提供当前年份
  2. 使用这种类型的代码在目录上循环,一次一个级别
    • 示例:for current_dir in /data/*/; do
  3. 使用basename或字符串修改只获取每个项目的目录名(去掉斜线(
    • 示例:current_dir=$(basename "$current_dir")
  4. 在每个级别,检查数字是否低于当前年/月/日(取决于级别(
    • 使用-lt/-gt进行比较
    • 示例:if [ "$current_dir" -lt "$current_year" ]; then。。。(删除它-或者先做一些日志记录,以确保你在正轨上(
  5. 如果数字等于(-eq(当前年/月,那么您可以循环到下一个月
    • 示例:for current_dir2 in /data/"$current_dir"/*/; do

您可以尝试以下操作:

find /root/data -type d -not -name "ImportantFolder" -mtime +1 -exec rm -rf {} ;

因此,只搜索目录,不包括";ImportantFolder"(未测试(。

最新更新