web-dev-qa-db-ja.com

日付としてのファイル名に基づいて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

この命名規則に従う必要はありません。より適切な日付形式を使用できます。

4
Ari

これが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 "実際にファイルを削除する代わりに、これは前に結果をテストします。

4
darxmurf

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
5

これはあなたの答えに正確には適合しませんが、ロジックを処理すると、問題を解決する多くの方法が見つかると思います。

これは、「%username%.Backup.YEAR.MONTH.DAY.time.HOURS.MINUTES」というファイル名形式に基づいて、過去14日以内にバックアップが作成されたかどうかを確認したいことに基づいています。

現在の状態では、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
    )
)
1
HowardRawr