Поиск по дате с помощью командной строки

Есть ли способ поиска файлов в каталоге по дате? Я хочу найти все файлы с датой создания больше определенной даты, можно ли это сделать с помощью команды 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 throws Параметр не может быть найден на 2.0 - person drruruu; 13.02.2015
comment
Может кто-нибудь объяснить, почему эта команда находит все файлы, измененные на дату, но игнорирует время? директор -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