代码之家  ›  专栏  ›  技术社区  ›  ian_scho

Windows“dir”命令,按名称排序并<something>

  •  4
  • ian_scho  · 技术社区  · 17 年前

    我们可以在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 按名字排序,它像人一样读取数字?

    6 回复  |  直到 7 年前
        1
  •  7
  •   Doug L.    17 年前

    您最好的选择(如果可能)是在较小的数字上加上足够多的前导零(在本例中是两个),这样排序就可以按预期进行。

        2
  •  3
  •   Community Mohan Dere    11 年前

    Windows资源管理器使用特殊的排序功能, StrCmpLogicalW ,它不是由 命令提示符 因此,输出的差异。不过,您可以用它编写自己的排序程序。

    你也可能对迈克尔·卡普兰的作品感兴趣 this subject (来自Raymond Chen's suggestion box )

        3
  •  1
  •   community wiki ian_scho    17 年前

    他和他。你们都想知道我的解决方案吗?

    我正在使用一个名为ImageMagic的程序,它将我的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
    )
    

    因此 DR*JPG/OD 命令通过升序(创建?)日期,我们可以完全忽略实际的文件名。

        4
  •  0
  •   phuclv    7 年前

    目前还没有可以自然排序的内置命令行工具。如果你想的话,请 vote for the feature 让微软改变主意

    然而,这可以用regex替换来模拟。在Windows上,您可以使用JScript和VBS来实现这一点。但最简单的方法是使用PowerShell。你可以这样从cmd.exe调用它

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

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

    How to sort by file name the same way Windows Explorer does?

    本地批处理解决方案可以在 Naturally Sort Files in Batch 如果文件末尾只有一个数字

    @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
    
        5
  •  -1
  •       17 年前

    4NT/TCC/TC从 JPSoft 默认情况下使用自然排序顺序;或者,如果您可以访问GNU“排序”程序,例如 Cygwin tools 您可以执行“ls-1/b in/sort-g”或“dir/b \cygwin\b in\sort-g”之类的操作;这将以自然的排序顺序为您提供文件名。

    如果您被限制使用Windows自带的工具,则可以尝试 Windows Scripting tools 并执行类似的操作,使用filesystemobject获取文件名,使用正则表达式提取文件名的数字部分作为字典对象中的键。我将把实际的编码作为练习留给读者:)

        6
  •  -2
  •   Biri    17 年前

    不,这是不可能的。Windows资源管理器使用不同的方法来处理此问题。