【问题标题】:How can I get files older than a specified date?如何获取早于指定日期的文件?
【发布时间】:2012-02-08 07:30:13
【问题描述】:

如果已经有人问过这个问题,我深表歉意,但我似乎无法准确找到我正在寻找的内容。我希望能够在 XP(使用 cmd)中找到早于特定日期的文件。我想做一些诸如 DIR/FIND 文件之类的超过 30 天的操作。

以下内容不起作用,但希望它能让您了解我正在尝试做什么。

FOR /f %%f IN ('DIR /b /t -30 I:\FOLDER1\*.pdf') DO move /Y Z:\FOLDER1\%%f "I:\FOLDER2\"

谢谢!

【问题讨论】:

    标签: windows batch-file windows-xp find


    【解决方案1】:

    儒略日期函数取自DosTips.com function library

    首先使用 XCOPY /L /D 获取过去 30 天内修改过的文件列表:保存到排除列表。

    然后使用 XCOPY /L 获取所有文件并通过 FINDSTR 管道从排除列表中排除文件并将结果保存到包含列表中。

    最后遍历包含列表并移动文件

    @echo off
    setlocal
    
    set src="I:\FOLDER1\*.pdf"
    set dest="I:\FOLDER2"
    set incl="%temp%\includeFiles%random%.txt"
    set excl="%temp%\excludeFiles%random%.txt"
    
    call :jdate jd
    set /a jd-=30
    call :jdate2date jd yyyy mm dd
    xcopy %src% %dest% /d:%mm%-%dd%-%yyyy% /l | findstr /vxrc:"[0-9]* File(s)" >%excl%
    xcopy %src% %dest% /l | findstr /vxrc:"[0-9]* File(s)" | findstr /vixlg:%excl% >%incl%
    set /a "fail=0, ok=0"
    for /f "usebackq eol=: delims=" %%F in (%incl%) do (
      move /y "%%F" %dest% >nul 2>&1 && (
        echo "%%F"
        set /a "ok+=1"
      ) || (
        >&2 echo ERROR: Unable to move "%%F"
        set /a "fail+=1"
      )
    )
    echo ----------------------
    echo Moved %ok% files
    if %fail% gtr 0 echo Failed to move %fail% files
    del %excl%
    del %incl%
    exit /b %fail%
    
    
    :jdate2date JD YYYY MM DD -- converts julian days to gregorian date format
    ::                     -- JD   [in]  - julian days
    ::                     -- YYYY [out] - gregorian year, i.e. 2006
    ::                     -- MM   [out] - gregorian month, i.e. 12 for december
    ::                     -- DD   [out] - gregorian day, i.e. 31
    :$reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html
    :$created 20060101 :$changed 20080219 :$categories DateAndTime
    :$source http://www.dostips.com
    SETLOCAL ENABLEDELAYEDEXPANSION
    set /a L= %~1+68569,     N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*(L+1)/1461001
    set /a L= L-1461*I/4+31, J= 80*L/2447,  K= L-2447*J/80,      L= J/11
    set /a J= J+2-12*L,      I= 100*(N-49)+I+L
    set /a YYYY= I,  MM=100+J,  DD=100+K
    set MM=%MM:~-2%
    set DD=%DD:~-2%
    ( ENDLOCAL & REM RETURN VALUES
        IF "%~2" NEQ "" (SET %~2=%YYYY%) ELSE echo.%YYYY%
        IF "%~3" NEQ "" (SET %~3=%MM%) ELSE echo.%MM%
        IF "%~4" NEQ "" (SET %~4=%DD%) ELSE echo.%DD%
    )
    EXIT /b
    
    :jdate JD DateStr -- converts a date string to julian day number with respect to regional date format
    ::                -- JD      [out,opt] - julian days
    ::                -- DateStr [in,opt]  - date string, e.g. "03/31/2006" or "Fri 03/31/2006" or "31.3.2006"
    :$reference http://groups.google.com/group/alt.msdos.batch.nt/browse_frm/thread/a0c34d593e782e94/50ed3430b6446af8#50ed3430b6446af8
    :$created 20060101 :$changed 20090328 :$categories DateAndTime
    :$source http://www.dostips.com
    SETLOCAL
    set DateStr=%~2&if "%~2"=="" set DateStr=%date%
    for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
        for /f "tokens=1-3 delims=/.- " %%A in ("%DateStr:* =%") do (
            set %%a=%%A&set %%b=%%B&set %%c=%%C))
    set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100"
    if %yy% LSS 100 set /a yy+=2000 &rem Adds 2000 to two digit years
    set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4
    ENDLOCAL & IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
    EXIT /b
    

    我没有使用 XCOPY /EXCLUDE 选项,因为它将文件视为具有隐式通配符。因此,如果您指定 * 而不是 *.pdf,则名为 TEST 的排除文件也会导致名为 TEST1、TEST.TXT 和 TEST.EXE 的文件也被排除。

    在使用多个文字搜索字符串进行搜索时,需要 FINDSTR /I 选项来弥补 FINDSTR 错误。 /I 选项不应该是必需的,但是使用多个文字搜索字符串进行区分大小写的搜索可能会给出错误的结果。

    【讨论】:

    • 编辑 - 添加日志信息并弥补 FINDSTR 错误
    • 太棒了,我终于能够审查这个,它会解决的。谢谢你的努力!!!
    【解决方案2】:

    使用forfiles:

    forfiles /p "i:\folder1" /m *.pdf /d -30 /c "move /y z:\folder1\@file i:\folder2"
    

    【讨论】:

    • forfiles 在 XP 上不起作用(至少它不是一个有效的命令),我应该提到这一点。
    • @northpole:您是否尝试下载副本,例如来自petri.co.il/download_free_reskit_tools.htm 并运行它?
    • 不,但是,我确实抓住了 rktools,并且可以使用 robocopy 使其工作。但我希望能够使用已经安装的命令来执行此操作,这样我就不必在每台将要使用它的 PC 上下载和安装。
    • 如果您的请求与复制/移动文件有关,我会建议将 Robocopy 作为一种潜在的解决方案。它现在默认带有 Windows 7,所以如果你升级到 Win7,你会没事的。
    • 如果使用 Win XP 外部实用程序是一个选项,那么我建议在 UnixUtils 包中使用移植的“find”命令(请参阅unxutils.sourceforge.net),您只需复制 find.exe。 'find' 提供了一些扩展选项来根据文件的最后访问/修改来查找文件(请参阅 -ctime 选项)。
    【解决方案3】:

    请参阅batch file to delete files older than a specified date 的答案,了解使用 xcopy 执行此操作的方法。

    使用 xcopy 您确实需要指定完整日期(您不能说“30 天前”),但您可以通过其他命令来计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2012-12-16
      • 2016-03-12
      • 2018-02-13
      • 1970-01-01
      相关资源
      最近更新 更多