파일 이름이 생성 날짜인 파일 폴더가 있는 경우:
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 셸( 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
이것은 귀하의 답변과 정확히 일치하지 않지만 논리를주의 깊게 살펴보면 문제를 해결할 수있는 다양한 방법을 찾을 수 있다고 생각합니다.
이는 파일 이름 형식 "%username%.Backup.YEAR.MONTH.DAY.time.HOURS.MINUTES"를 기반으로 지난 14일 동안 백업이 수행되었는지 확인하고 싶다는 사실에 기반합니다.
현재 상태에서는 28일 이상이 지나면 일수가 1보다 작지 않을 때까지 setlocal 내의 if 문을 반복하지 않기 때문에 올바른 결과가 생성되지 않을 것이라고 생각합니다.
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