Windows'dir'命令,按名称排序和<something> </something>

时间:2008-10-28 11:08:45

标签: windows cmd directory

我们可以在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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

Windows资源管理器使用特殊的排序功能StrCmpLogicalW cmd.exe 不使用它,因此输出的差异。不过,你可以用它编写自己的排序程序。

您可能也对迈克尔·卡普兰在this subject(来自Raymond Chen的suggestion box)的参赛作品感兴趣。

答案 2 :(得分:1)

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

我正在使用一个名为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
)

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

答案 3 :(得分:0)

当前没有内置的命令行工具可以自然排序。如果需要,请vote for the feature让Microsoft改变主意

这可以用正则表达式替换来模拟。在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 :(得分:-1)

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

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

答案 5 :(得分:-2)

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