使用命令行按日期搜索
Posted
技术标签:
【中文标题】使用命令行按日期搜索【英文标题】:Search by date using command line 【发布时间】:2012-03-03 07:14:24 【问题描述】:有什么方法可以根据日期搜索目录中的文件吗?我想查找创建日期大于特定日期的所有文件,可以使用dir
命令吗?
【问题讨论】:
dir /OD
至少会按日期排序
dir 不能,但 Unix 查找命令 可以。 Dos port available here
superuser.com/a/326025/3588 在 SuperUser 是一个优雅的解决方案,使用 xcopy
而无需实际复制
xcopy 解决方案适用于修改日期和未创建日期。
是时候改变接受的答案了。
【参考方案1】:
好吧,据我所知,你不能,但是这种想法会起作用,但除非你的日期范围很短,否则仍然真的没用;)
for /R %a in (01 02 03 04 05) do dir | find "02/%a/2012"
【讨论】:
【参考方案2】:dir
本身不能按日期过滤,但您可以使用for
命令解析dir
的输出。如果在您的国家dir
以 YMD 格式打印日期,那么您只需将其与给定日期进行比较。如果日期部分的顺序不同,则必须使用另一个for
命令来解析日期并将其更改为 YMD。这将显示 2 月 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
)
【讨论】:
谢谢你这就是我需要的,我可以用小时:分钟来比较。最后是有帮助的书籍来学习 shell 脚本。 要使用分钟进行比较,请执行以下更改:tokens=1,2,4
,然后是 if "%%A %%B" GTR "2012-02-05 11:23" echo %%A %%B %%C
要学习,您可以从 en.wikipedia.org/wiki/Batch_file 开始,然后继续使用前三个外部链接。【参考方案3】:
刚刚发现forfiles
命令。
forfiles /s /m *.log /d -7 /c "cmd /c echo @path"
将列出所有子目录中超过 7 天前修改的所有日志文件,尽管它似乎没有查看创建日期。它确实支持指定特定日期。
请参阅forfiles /?
了解更多信息。
【讨论】:
超级好用! (当没有可用的 PowerShell 时)注意:如果您想在某个日期之后修改文件,则需要+
而不是 -
用于 /d
参数,所以类似于 +02/05/2012
而不是 -7
。还可以显示每个文件的日期和时间输出,您可以使用cmd /c echo @fdate @ftime @path
警告:希望使用 UNC 路径的人有祸了。或者在 Windows 的许多其他地方...
FORFILES /D
仅适用于修改后的日期。要解决 UNC 问题,只需使用 MKLINK /D
。
对于任何希望 /d +7
向您展示不到 7 天前修改的文件的人,不。它将显示files modified seven days from now。您必须使用日期,例如 +02/05/2012
。【参考方案4】:
使用 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。
【讨论】:
我试过了: dir 。 *.svg | ? LastWriteTimeUtc -gt ([datetime]"2013-05-01") 但收到“Where-Object:无法绑定参数“FilterScript”。无法将“System.String”类型的“LastWriteTimeUtc”值转换为“System.Management”类型。 Automation.ScriptBlock”。 我相信我使用的语法适用于 PS 3.0 及更高版本。如果您有 PS 1.0 或 2.0,则必须使用如下脚本块:| ? $_.LastWriteTimeUtc -gt ([datetime]"2013-05-01")
啊,我在 Windows 7 和 PS 2 上。谢谢
dir -file 在 2.0 上抛出“找不到参数”
有人能解释一下为什么这个命令会发现所有在日期修改的文件但忽略时间?目录-s-文件| ? LastWriteTimeUtc -gt ([datetime]"2015-03-07 16:00:00") 即找到所有在 2015-03-07 00:00:00 之后修改的文件,这不是我想要的。我希望在下午 4 点之后修改所有文件。提前致谢。【参考方案5】:
对我来说更简单的方法是
dir /s *.xlsx | find "07/14/2016"
【讨论】:
以上是关于使用命令行按日期搜索的主要内容,如果未能解决你的问题,请参考以下文章