2012-02-10 135 views
13

有什么方法可以根据日期搜索目录中的文件吗?我想查找创建日期大于特定日期的所有文件,是否可以使用dir命令执行此操作?使用命令行按日期搜索

+0

'DIR/OD'会按日期排序,至少 – nolegs 2012-02-10 20:17:50

+1

目录不能,但Unix的find命令*可*。 [Dos port available here](http://sourceforge.net/projects/unxutils/) – 2012-02-10 21:59:06

+0

http://superuser.com/a/326025/3588在SuperUser是一个优雅的解决方案,使用'xcopy'而不需要实际复制 – 2015-09-01 23:50:26

回答

4

dir本身不能按日期进行筛选,但您可以使用for命令解析dir的输出。如果您的国家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 
) 
+0

谢谢你,这就是我需要的,我可以使用小时:分钟比较。最后是有帮助的书籍来学习shell脚本。 – developer 2012-02-12 15:30:26

+0

要使用分钟进行比较,请执行以下更改:'tokens = 1,2,4'然后'if %% A %% B“GTR”2012-02-05 11:23“echo %% A %% B %% C' 要学习,您可以从http://en.wikipedia.org/wiki/Batch_file开始,然后继续使用三个第一个外部链接。 – MBu 2012-02-12 21:00:04

3

那么你不能因为据我所知,但这种思考的工作,但还是很没用的,除非你有一个简短的日期范围;)

for /R %a in (01 02 03 04 05) do dir | find "02/%a/2012" 
+0

不错!使用'dir/tc'来处理创建日期。 – Marc 2016-08-12 09:49:05

35

刚刚发现forfiles命令。

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

将列出所有修改超过七天的日志文件,在所有子目录,但它似乎并没有看创建日期。它确实支持指定一个特定的日期。

有关更多信息,请参阅forfiles /?

+0

超级有用! (当没有PowerShell可用时)注意:如果你想在一个日期之后修改文件,你需要用'+'而不是'-'作为'/ d'参数,所以'+ 02/05/2012'而不是'-7 '。还要显示每个文件的日期和时间输出,你可以使用'cmd/c echo @fdate @ftime @ path' – bob 2013-07-10 14:58:06

+4

+1这应该是被接受的答案 – 2014-02-19 01:07:22

+1

警告:有些人希望使用UNC路径。或在Windows中的许多其他地方... – 2016-06-21 16:06:18

0

这很容易与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

+0

我试过了:dir。 * .svg | ? LastWriteTimeUtc -gt([datetime]“2013-05-01”)但收到“Where-Object:无法绑定参数'FilterScript'。无法将类型为”System.String “的”LastWriteTimeUtc“值转换为键入”System.Management .Automation.ScriptBlock“。 – 2014-10-01 11:23:53

+0

我使用的语法适用于PS 3.0以上,我相信如果你有PS 1.0或2.0,你必须使用如下的scriptblock:'|?{$ _。LastWriteTimeUtc -gt([datetime] “2013-05-01”)}' – bouvierr 2014-10-01 11:37:44

+0

啊我在Windows 7上用PS 2.谢谢 – 2014-10-01 16:56:09

2

对我来说更简单的方法是一样的东西

dir /s *.xlsx | find "07/14/2016"