我做了一些挖掘,似乎无法在任何地方找到简单的答案,也许我找错了地方。我只想按文件的修改时间对文件进行排序,从最旧到最新。这可能吗?
for %%i in (Input/*.json) do (
)
如果您只想对它们进行排序,那么
DIR
将是最快的路线,您可以使用FOR /F
循环解析该输出。
此代码将为您提供升序日期:
FOR /F "tokens=*" %%A IN ('
DIR /B
/O:D
/A:-D
Input\*.json
') DO (
ECHO(Found: "%%~A"
)
/O
选项更改顺序。/O:D
或/OD
订单日期升序(最旧的在前)/O:-D
或/O-D
订单日期降序(最新的在前)
/A
选项更改所选项目的类型。/A:-D
或/A-D
选择文件项目,/A:D
或/AD
选择目录项目。
/B
选项仅输出文件名,除非/S
开关与它一起使用来递归目录树,在这种情况下它将输出文件路径。
唯一的问题(没有
/S
)是:
当您查看子目录而不是同一目录时,您无法从输出中提取任何其他 FOR 变量信息。
IE:您不能使用
%%~tA
打印日期/时间,并且%%~fA
会给出错误的文件路径。
如果需要返回这些信息,您将必须单独查找信息或从 DIR cmd 中抓取所需的信息,或使用递归子目录的
/S
选项。
感谢@Michel de Ruiter 注意到这一点,并提请我注意并更新这一点,现在我将扩展您的扩展部分。
如果您想从for循环中获取路径或时间戳等,但又不想浪费时间或从子目录中获取结果,您可以修改为以下版本。
这使用
Findstr
使用基本正则表达式删除初始搜索目录下的任何子目录。
FOR /F "tokens=*" %%A IN ('
DIR /B
/O:D
/A:-D
Input\*.json
^| findstr /i /v "\\input\\.*\\.*"
') DO (
ECHO(Found: "%%~A"
)
在此用法中,
findstr
命令使用这些开关来匹配正则表达式,该正则表达式与可能匹配文件的任何子目录相匹配(由于dir
命令上的选项,如上所述,没有文件的目录将被跳过)
/i
选项表示匹配不区分大小写
/v
选项意味着排除与模式匹配的结果
模式出现在双引号内
"\\input\\.*\\.*"
这里这是一个基本的正则表达式,其中句点.
匹配任何内容,而astrix*
表示对前一个字符进行任意次数的数学运算,因此.*
表示匹配任何字符零或更多次。
\\
匹配目录路径的反斜杠 \
是普通正则表达式中的转义字符,在 findstr
中我们可以将其作为 \
或 \\
来正确匹配,我选择 \\
因为这是一致的具有跨所有平台的正则表达式的定义语法。
最后我们必须有一个尾随的`.\.”以确保我们忽略与子目录相关的所有条目。
值得注意的是,通过在
findstr
循环的命令部分中使用 FOR
,可以更快地执行。