根据文件名日期删除超过 30 天的文件

根据文件名日期删除超过 30 天的文件

如果我有一个文件文件夹,其文件名是创建日期:

2019_04_30.txt
2019_04_15.txt
2019_04_10.txt
2019_02_20.txt
2019_01_05.txt

我如何将文件名与今天的当前日期进行比较

$ date "+%Y_%m_%d"
>>> 2019_04_30

如果文件名日期超过 30 天,则将其删除。我希望最终得到

2019_04_30.txt
2019_04_15.txt
2019_04_10.txt

我不必遵循这个命名约定,我可以使用更合适的日期格式。

答案1

这是一个 bash 解决方案。

f30days=$(date +%s --date="-30 days")
for file in 20*.txt; do
    fdate=$(echo $file | tr _ -)
    fsec=$(date +%s --date=${fdate/.txt/})
    if [[ $fsec -lt $f30days ]]; then
        echo "rm $file"
    fi
done

我用“”结束它,echo rm $file而不是真正删除你的文件,这将测试之前的结果。

答案2

zsh

zmodload zsh/datetime
strftime -s start '%Y_%m_%d.txt' $((EPOCHSECONDS - 30*86400))
echo -E rm -i 2*.txt(e:'[[ $REPLY > $start ]]':)

高兴的时候去掉echo -E

在 GNU 系统和 GNU shell ( bash) 上,您可以执行以下操作:

start=$(date -d '30 days ago' +%Y_%m_%d.txt)
list=()
shopt -s nullglob
for file in 2*.txt; do
  [[ $file > $start ]] && list+=("$file")
done
if (( ${#list[@]} > 0)); then
  echo -E rm -i "${list[@]}"
fi

答案3

这并不完全符合你的答案,但我认为如果你仔细研究逻辑,你会发现很多方法来解决你的问题。

这是基于我想要检查是否在过去 14 天内根据文件名格式“%username%.Backup.YEAR.MONTH.DAY.time.HOURS.MINUTES”进行了备份

我相信在当前状态下,如果超过 28 天,由于没有循环遍历 setlocal 内的 if 语句,直到天数不再小于 1,它将无法产生正确的结果。

set year=%date:~10%
set month=%date:~4,2%
set day=%date:~7,2%
set /a day-=14
set /a leapyear=!(%year%%%4)
set numdays=31 28 31 30 31 30 31 31 30 31 30 31
if %leapyear%==1 set numdays=31 29 31 30 31 30 31 31 30 31 30 31

setlocal enabledelayedexpansion
    if %day% lss 1 (
        set /a month-=1
        if !month! lss 1 (
            set /a year-=1
            set /a month+=12
        )
        set mcount=0
        for %%A in (%numdays%) do (
            set /a mcount+=1
            if !mcount!==!month! set /a day+=%%A
        )
    )
    set day=0%day%
    set month=0%month%
endlocal & (set day=%day:~-2%)& (set month=%month:~-2%)& (set year=%year%)

for /f "tokens=3,4,5 delims=." %%A in ('dir /b /a:d /o:-n "%backuppath%" ^| findstr /r "%username%.Backup.*"') do (
    if %year%%month%%day% lss %%A%%B%%C (
        goto endofscript
    )
)

答案4

yyyy-mm-dd 字符串有一个属性,即它们按字母顺序排序。所以就这样做:

fdate=$(date +%F --date="-30 days")
for file in 20*; do
    if [[ $file =~ [0-9]{4}-[0-9]{2}-[0-9]{2} && $file -gt $fdate ]]; then
        rm -rf "$file"
    fi
done

相关内容