如果我有一个文件文件夹,其文件名是创建日期:
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