【问题标题】:Windows 'dir' command, Order By Name AND <something>Windows 'dir' 命令,按名称排序 AND <something>
【发布时间】:2010-09-19 13:34:24
【问题描述】:

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

【问题讨论】:

标签: windows cmd directory


【解决方案1】:

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

【讨论】:

  • 如果我曾经预计需要按顺序处理文件,我会使用 1 到 4 个前导零或使用完整的 UTC 格式时间戳 20081028143531。这是一个 老把戏,可以追溯到 70 年代末或 80 年代初。也许在那之前……
【解决方案2】:

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

您可能还对 Michael Kaplan 在 this subject 上的条目感兴趣(来自 Raymond Chen 的 suggestion box)。

【讨论】:

    【解决方案3】:

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

    但是,这可以通过正则表达式替换来模拟,以填充零以使数字具有相同的长度。这样lexicographic sort 就相当于自然排序。在 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
    

    【讨论】:

      【解决方案4】:

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

      我正在使用一个名为 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 命令按升序(创建?)日期对目录内容进行排序,我们可以完全忽略实际文件名。

      【讨论】:

      • 我很确定最后修改日期(不是创建日期)用于 'dir /od'。对于创建日期,您需要 'dir /tc /od'。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-19
          • 2014-07-21
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          • 1970-01-01
          • 2013-07-21
          相关资源
          最近更新 更多