Как я могу получить файлы старше указанной даты? - PullRequest
2 голосов
/ 12 января 2012

Я прошу прощения, если этот вопрос уже задавался, но я не могу найти именно то, что я ищу. Я хочу иметь возможность находить в XP файлы (используя cmd), которые старше определенной даты. Я хочу сделать что-то вроде файлов DIR / FIND, которые старше 30 дней.

Следующее не работает, но, надеюсь, это даст вам представление о том, что я пытаюсь сделать.

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Юлианская функция даты взята из библиотеки функций DosTips.com

Сначала используйте 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 не требуется, но выполнение поиска с учетом регистра с несколькими литеральными поисковыми строками может дать неправильный результат.

3 голосов
/ 12 января 2012

Использование forfiles:

forfiles /p "i:\folder1" /m *.pdf /d -30 /c "move /y z:\folder1\@file i:\folder2"
0 голосов
/ 17 января 2012

См. Ответ на командный файл для удаления файлов старше указанной даты , чтобы узнать, как это сделать с помощью xcopy.

В xcopy вам необходимо указать полную дату (вы не можете сказать «30 дней назад»), но вы можете рассчитать ее с помощью других команд.

...