Търсете по дата с помощта на командния ред

Има ли някакъв начин за търсене на файлове в директория въз основа на дата? Искам да намеря всички файлове със създадена дата, по-голяма от конкретна дата, възможно ли е да го направя с команда dir?


person Karim Harazin    schedule 10.02.2012    source източник
comment
dir /OD ще сортира поне по дата   -  person nolegs    schedule 11.02.2012
comment
dir не може, но командата за намиране на Unix може. DOS портът е наличен тук   -  person Vik David    schedule 11.02.2012
comment
superuser.com/a/326025/3588 в SuperUser е елегантно решение, използващо xcopy без реално копиране   -  person CAD bloke    schedule 02.09.2015
comment
Решението xcopy се прилага за променена и несъздадена дата.   -  person Marc    schedule 12.08.2016
comment
Време е да промените приетия отговор.   -  person Noumenon    schedule 07.11.2017


Отговори (5)


dir сам по себе си не може да филтрира по дата, но можете да анализирате изхода на dir с помощта на команда for. Ако във вашата страна dir отпечатва датата във формат YMD, тогава трябва само да я сравните с дадената дата. Ако редът на частите от датата е различен, тогава трябва да използвате друга команда for, за да анализирате датата и да я промените на YMD. Това ще покаже списък с файлове, променени след 5 февруари.

@Echo Off

for /f "usebackq tokens=1,4 skip=5" %%A in (`dir /-c`) do (
  if %%A GTR 2012-02-05 echo %%A %%B
)

if прави стандартно сравнение на низове, така че в края можете да получите допълнителен ред, ако обобщеният ред премине сравнението. За да го избегнете, можете да използвате if %%A GTR 2012-02-05 if exist %%B echo %%A %%B

РЕДАКТИРАНЕ: Има още по-добър подход, който избягва анализирането на изхода dir и също така позволява търсене по време, а не само по дата:

@Echo Off

for /r %%A in (*) do (
  if "%%~tA" GTR "2012-02-05 00:00" echo %%~tA %%A
)
person MBu    schedule 11.02.2012
comment
благодаря, това е, което ми трябва, мога ли да използвам час: минути със сравнение. И накрая, има полезни книги за научаване на скриптове с обвивка. - person Karim Harazin; 12.02.2012
comment
За да използвате минути за сравнение, направете следните промени: tokens=1,2,4 и след това if "%%A %%B" GTR "2012-02-05 11:23" echo %%A %%B %%C За да научите, можете да започнете с en. wikipedia.org/wiki/Batch_file и след това продължете с първите три външни връзки. - person MBu; 13.02.2012

Току-що открих командата forfiles.

forfiles /s /m *.log /d -7 /c "cmd /c echo @path"

Ще изведе всички регистрационни файлове, модифицирани на повече от седем дни, във всички поддиректории, въпреки че изглежда не гледа датата на създаване. Поддържа посочване на конкретна дата.

Вижте forfiles /? за повече информация.

person Dave    schedule 29.05.2013
comment
Супер-полезно! (когато няма наличен PowerShell) ЗАБЕЛЕЖКА: Ако искате файловете да бъдат модифицирани след дата, имате нужда от + вместо - за параметъра /d, така че нещо като +02/05/2012 вместо -7. Също така, за да покажете изхода за дата и час за всеки файл, можете да използвате cmd /c echo @fdate @ftime @path - person bob; 10.07.2013
comment
Предупреждение: Горко на вас, които искате да използвате UNC пътища с това. Или на много други места в Windows... - person underscore_d; 21.06.2016
comment
FORFILES /D работи само с променени дати. За да разрешите проблеми с UNC, просто използвайте MKLINK /D. - person Marc; 12.08.2016
comment
За всеки, който очаква /d +7 да ви покаже файлове, модифицирани преди по-малко от седем дни, не. Ще ви покаже файлове, променени след седем дни. Трябва да използвате дата като +02/05/2012. - person Noumenon; 07.11.2017

по-лесен начин за мен е нещо подобно

dir /s *.xlsx | find "07/14/2016"
person skelly    schedule 14.07.2016

Е, не можете, доколкото знам, но този вид мисъл ще свърши работа, но все още е наистина безполезен, освен ако нямате кратък период от време;)

for /R %a in (01 02 03 04 05) do dir | find "02/%a/2012"
person Justin    schedule 10.02.2012

Това е лесно да се направи с PowerShell. Знам, че въпросът ви беше за cmd, но PS е включен в Windows 7 и по-нови версии. Може да се инсталира и на XP и Vista.

Използвайте командата Get-ChildItem (с псевдоним dir), за да получите всички файлове. Препратете изхода към командата Where-Object (с псевдоним ?), за да върнете файлове, където датата е по-голяма от (-gt) конкретна дата.

За Powershell 2.0 (по подразбиране в Windows 7), трябва да използвате скриптов блок:

dir -file | ? {$_.LastWriteTimeUtc -gt ([datetime]"2013-05-01")}

За Powershell 3.0 (по подразбиране за Windows 8) и по-нови можете да използвате този по-прост синтаксис вместо това:

dir -file | ? LastWriteTimeUtc -gt ([datetime]"2013-05-01")

Командата dir -file връща колекция от System.IO.FileInfo обекти. Този файлов обект има много свойства, които можете да използвате за сложно филтриране (размер на файла, дата на създаване и т.н.). Вижте MSDN за документация.

person bouvierr    schedule 08.12.2013
comment
Опитах: реж. *.svg | ? LastWriteTimeUtc -gt ([datetime]2013-05-01), но получи Where-Object: Не може да обвърже параметъра „FilterScript“. Не може да преобразува стойността LastWriteTimeUtc от тип System.String в тип System.Management.Automation.ScriptBlock. - person Chris Nevill; 01.10.2014
comment
Синтаксисът, който използвах, вярвам, че работи за PS 3.0 и по-нови версии. Ако имате PS 1.0 или 2.0, трябва да използвате скриптов блок по следния начин: | ? {$_.LastWriteTimeUtc -gt ([datetime]"2013-05-01")} - person bouvierr; 01.10.2014
comment
А, аз съм на Windows 7 с PS 2. Благодаря - person Chris Nevill; 01.10.2014
comment
dir -file хвърля Параметър не може да бъде намерен на 2.0 - person drruruu; 13.02.2015
comment
Може ли някой да обясни защо тази команда намира всички файлове, променени на датата, но пренебрегва часа? dir -s -файл | ? LastWriteTimeUtc -gt ([datetime]2015-03-07 16:00:00) Тоест намира всички файлове, модифицирани след 2015-03-07 00:00:00, което НЕ е това, което искам. Искам всички файлове да бъдат променени след 16:00 часа. Благодаря предварително. - person Joel Finkel; 09.03.2015
comment
@JoelFinkel работи добре за мен. Между другото филтрирате с UTC време, така че това може да обясни разликата. - person bouvierr; 10.03.2015