5

我们可以在 Windows 资源管理器中看到按名称排序的目录文件。

如果我在 Windows 命令提示符下尝试相同的操作,它会按不同的名称排序 -正确

dir *.jpg /ON /B

cubierta.jpg
pag00.jpg
pag06.jpg
pag08.jpg
pag09.jpg
pag100.jpg
pag101.jpg
pag102.jpg
pag103.jpg
pag104.jpg
pag105.jpg
pag106.jpg
pag107.jpg
pag108.jpg
pag109.jpg
pag11.jpg, etc, etc, etc, ...

有没有办法dir按名称订购,它可以像人类一样读取数字?

4

6 回答 6

8

您最好的选择(如果可能)是在较小的数字中添加足够多的前导零(在这种情况下为两个),以便排序按预期进行。

于 2008-10-28T11:13:47.953 回答
5

Windows 资源管理器使用特殊的排序函数StrCmpLogicalWcmd.exe不使用该函数,因此输出存在差异。不过,您可以用它编写自己的排序程序。

您可能还对 Michael Kaplan 关于这个 主题的条目感兴趣(来自 Raymond Chen 的意见箱)。

于 2008-10-28T11:42:15.680 回答
1

这称为自然排序。目前没有可以自然排序的内置命令行工具。如果你愿意,请投票支持让微软改变主意的功能

然而,这可以通过正则表达式替换来模拟,以填充零以使数字具有相同的长度。这样,字典排序就等同于自然排序。在 Windows 上,您可以使用 Jscript 和 VBS 来执行此操作。但最简单的方法是使用 powershell。您可以像这样从 cmd.exe 调用它

powershell -Command "(Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name"

当然,PadLeft(20)如果您的文件包含更长的数字系列,您需要更改数字

如何像 Windows Explorer 一样按文件名排序?

如果您的文件末尾只有一个数字,则可以在批量自然排序文件中找到本机批处理解决方案

@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
    set num=00000000000000000000%%a
    set num=!num:~-20!
    set $!num!=%%a
)
for /f "tokens=1,* delims==" %%a in ('set $0') do echo %%b
于 2018-08-16T10:29:23.443 回答
0

嘿嘿嘿。大家想知道我的解决方案吗?

我正在使用一个名为 ImageMagick 的程序将我的 200MB PDF 文件转换为 JPG。在漫长的过程结束时,它按数字顺序序列化所有文件......所以基本上文件创建日期的值随着每个文件被写入硬盘驱动器而略有增加。因此,以下两个批处理文件命令中的任何一个都将以“正确”顺序写入文件:

dir *.jpg /ODN /B > files.txt

for /f "tokens=*" %%a in ('dir *.jpg /ODN /B') do (
    echo ^<page^>%%a^</page^> >>pages.xml.fragment
)

因此,该dir *.jpg /OD命令按升序(创建?)日期对目录内容进行排序,我们可以完全忽略实际的文件名。

于 2008-12-09T08:15:35.103 回答
-1

JPSoft的4NT/TCC/TC默认使用自然排序。或者,如果您可以访问 GNUsort程序,例如Cygwin 工具,您可以执行类似ls -1 | /<cygwin>bin/sort -gdir /b | \cygwin\bin\sort -g;这将以自然排序顺序为您提供文件名。

如果您受限于 Windows 原生的工具,您可以尝试使用Windows 脚本工具并执行一些操作,例如使用FileSystemObject来获取文件名,并使用正则表达式来提取文件名的数字部分以用作 Dictionary 对象中的键. 我将把实际的编码作为练习留给读者:)

于 2008-10-28T14:40:38.237 回答
-2

不,没有办法做到这一点。Windows 资源管理器使用不同的方法来处理此问题。

于 2008-10-28T11:12:29.407 回答