可以在 FOR 循环中对文件进行排序/排序吗?

问题描述 投票:0回答:2

我做了一些挖掘,似乎无法在任何地方找到简单的答案,也许我找错了地方。我只想按文件的修改时间对文件进行排序,从最旧到最新。这可能吗?

for %%i in (Input/*.json) do (

)
batch-file cmd
2个回答
2
投票

如果您只想对它们进行排序,那么

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
,可以更快地执行。


1
投票

为了改进Ben答案,只需

  1. /S
    添加到
    DIR
    以使
    %%~tA
    %%~fA
    工作(完整路径),并且
  2. 使用
    "tokens=*"
    /F
    来支持文件名中的空格(检查
    FOR /?

换句话说:

FOR /F "tokens=*" %%a IN ('DIR /B /S /O:D /A:-D Input\*.json') DO (
 ECHO "%%a"
)
© www.soinside.com 2019 - 2024. All rights reserved.