【问题标题】:Need to clean log files based on filename and date需要根据文件名和日期清理日志文件
【发布时间】:2013-01-20 14:29:00
【问题描述】:

我有一个包含混合日志文件的文件夹 - 例如:

AAA.0.1.txt
AAA.0.2.txt
BBB.1.2.txt
BBB.1.3.txt
BBB.1.4.txt
CCC.0.5.txt
CCC.0.6.txt

我需要一个快速的小批处理文件来清除 A、B 和 C 中除最近(按日期)的 3 个文件之外的所有文件。

我可以删除文件夹中除他最近的 3 个文件之外的所有文件:

for /f "tokens=* skip=3" %%F in ('dir %myDir% /o-d /tc /b') do del %myDir%\%%F

但我不确定如何在不硬编码 A、B 和 C 并执行 3 个单独循环的情况下添加命名约定(如果 D 出现,则它会被完全忽略)。

有什么想法吗?

好的,我想通了:

@echo off
setlocal enabledelayedexpansion
cls
set fileDir=C:\My\Log\Path
set prev=A
for /f "tokens=*" %%P in ('dir %fileDir% /o-d /tc /b') do (
    set fileName=%%P
    for /f "tokens=1,2,3,4 delims=. " %%a in ("!fileName!") do set proj=%%a

    if "!proj!" == "!prev!" (
        REM skip
    ) else (
        for /f "tokens=* skip=3" %%F in ('dir %fileDir%\!proj!.* /o-d /tc /b') do del %fileDir%\%%F
        set prev=!proj!
    )
)

【问题讨论】:

    标签: windows loops batch-file


    【解决方案1】:

    我相信您想要最后修改的日期,所以我将选项更改为/T2。如果您确实想要创建日期,请改回/TC。

    for /f "delims=." %%A in ('dir /a-d /b "%myDir%\*.*.txt"') do (
      for /f "skip=3 delims=" %%F in (
        'dir /a-d /o-d /tw /b "%myDir%\%%A.*.txt'
      ) do del "%myDir%\%%F"
    )
    

    上面可能有点低效,因为它会尝试为每个文件删除一次旧文件。您实际上只需要为每个唯一的名称前缀删除一次旧文件 - 这可以实现,但我认为增加的复杂性不值得。以上工作正常。

    【讨论】:

    • 谢谢,我已经想通了。它不会让我回答我自己的问题,所以我只是编辑了原始帖子。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多