美文网首页
删除后缀名较小的日期

删除后缀名较小的日期

作者: 禾白小三飘 | 来源:发表于2016-01-07 15:53 被阅读34次

    问题要求

    求一段bat指令实现如下功能
    文件夹内有很多文件比如

    a.txt.1 a.txt.2 a.txt.3 --a.txt.n
    b.txt.1 b.txt.2 b.txt.3 --b.txt.n
    .
    .
    x.txt.1 x.txt.2 x.txt.3 --x.txt.n

    例如文件*.txt.n 其中"n"是文件版本号,现在想保留最高版本删除其他的版本.

    根据网友的提问,建立了一个测试环境。

    2015/05/12  11:08  1.txt.1
    2015/05/12  11:08  1.txt.2
    2015/05/12  11:08  1.txt.3
    2015/05/12  11:08  1.txt.4
    2015/05/12  11:08  1.txt.5
    2015/05/12  12:01  1.txt.6
    2015/05/12  11:08  2.txt.3
    2015/05/12  11:08  2.txt.4
    2015/05/12  13:40  2.txt.5
    

    跳转法:

    @echo off & setlocal enabledelayedexpansion
    cd d:\test
    ::取一个不含后缀的文件名
    for %%i in (*.txt.*) do (
    set fname=%%~ni
    call :1
    )
    echo 执行完成 & pause >nul & exit
    
    :1
    set fsum=0
    for %%a in (%fname%.*) do set /a fsum+=1
    echo 文件名:%fname% 数量:%fsum%
    ::判断该文件名的数量,如果只有1个就回去call继续下一个文件名,如果不是1个就继续执行后面的命令
    if %fsum% equ 1 goto :eof
    for /f "delims=" %%i in ('dir /od /b /a-d %fname%.*') do (set endf=%%i & set endt=%%~ti)
    ::通过按照日期排序,排在最后的是最新的文件,将文件的文件名和日期保存到变量中。
    echo 最后的文件是:%endf% %endt%
    echo 确认删除其他文件? & pause >nul 
    ::小于最新文件的执行删除操作
    for /f "delims=" %%i in ('dir /od /b /a-d %fname%.*') do (
     if "%%~ti" lss "%endt%" del %%i
    )
    goto :eof
    ::删除完成,回到call的地方,继续下一个文件判断。
    

    思路是:
    获取一个文件名(不含后缀),然后判断相同的文件名有多少个。最后删除按照日期排序的旧文件。

    For循环法

    @echo off & setlocal enabledelayedexpansion
    cd d:\test
    for /f "delims=" %%i in ('dir /b /a-d *.txt.*') do (
     if %%~ti GTR !mm%%~ni! set mm%%~ni=%%~ti
    )
    for /f "tokens=1,2 delims=m=" %%i in ('set mm') do (
     for /f "delims=" %%a in ('dir /b /a-d %%i.*') do (
     if %%j NEQ %%~ta del %%a
     )
    )
    

    思路是:
    通过逐个文件对比得到日期最新的文件,然后如果其他文件日子不等于最新的日期,则执行删除操作。

    相关文章

      网友评论

          本文标题:删除后缀名较小的日期

          本文链接:https://www.haomeiwen.com/subject/njyfkttx.html