如何在命令提示符窗口中列出按数字排序的目录中的文件名?

Posted

技术标签:

【中文标题】如何在命令提示符窗口中列出按数字排序的目录中的文件名?【英文标题】:How to list file names in a directory sorted numeric in a command prompt window? 【发布时间】:2016-05-05 11:47:20 【问题描述】:

我需要dir文件夹中的文件,但排序器与 Windows 资源管理器中显示的不同。

例如,如果我的文件夹中有 1120113 作为文件名的文件, dir 在控制台窗口中按0113112 的顺序列出它们。

如何像 Windows 资源管理器一样在命令提示符窗口中列出目录中按数字排序的文件名?

【问题讨论】:

cmd.exe 中的 DIR 命令没有进行您想要的排序。使用DIR /? 查看排序选项。 GUI Windows 资源管理器确实可以进行您想要的排序。 【参考方案1】:

此批处理代码可能有助于使文件名输出按数字排序。请仔细阅读注释行,因为有一些限制。注释行是以命令rem 开头的行。

@echo off
setlocal EnableExtensions

rem Get from current directory all file names without path not enclosed
rem in double quotes sorted alphabetically and not numeric as wanted and
rem pass them to subroutine AddToFileList enclosed in double quotes.
for /F "delims=" %%I in ('dir * /A-D /B /ON 2^>nul') do call :AddToFileList "%%I"

rem The file names are now in an environment variables list. Output
rem this file names list. The split in environment variable and file
rem name without path works only if the file name does not contain
rem itself an equal sign.
for /F "tokens=1* delims==" %%I in ('set FileList[ 2^>nul') do echo %%J

rem Delete all local environment variables and restore previous
rem environment with the initial list of environment variables.
endlocal

rem Exit batch processing to avoid an unwanted fall through to the
rem subroutine AddToFileList.
exit /B


rem The subroutine AddToFileList is for adding each file found
rem into an environment variables array based on the file name.

rem The array works only for files with up to 5 digits in file number,
rem i.e. for file numbers in range 0 to 99999. That should be enough.

:AddToFileList
rem Get just the file name without path and without file extension.
set "FileName=%~n1"
rem In case of name of file has only 1 point and no characters left
rem this point, the file name is the point and the file extension.
rem Such file names are not common on Windows, but exist often on *nix.
if "%FileName%" == "" set "FileName=%~x1"
set "FileNumber="

:GetFileNumber
for /F "delims=0123456789" %%I in ("%FileName:~-1%") do goto AddFileToArray
set "FileNumber=%FileName:~-1%%FileNumber%"
set "FileName=%FileName:~0,-1%"
if not "%FileName%" == "" goto GetFileNumber

:AddFileToArray
set "FileNumber=00000%FileNumber%"
set "FileNumber=%FileNumber:~-5%"
set "FileList[%FileName%_%FileNumber%]=%~1"

rem Exit the subroutine and continue in FOR loop in main batch code block.
goto :EOF

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

call /? dir /? echo /? endlocal /? exit /? for /? goto /? if /? rem /? set /? setlocal /?

另请参阅有关 Using command redirection operators 的 Microsoft 文章以了解 2^>nul 的解释,即 2>nul 使用重定向运算符 > 转义 ^ 以获得在执行命令时应用的重定向 DIR 和 SET。如果当前目录树中没有与文件名模式 *.txt 匹配的文件,则此重定向会抑制 DIRSET 输出的错误消息。

【讨论】:

以上是关于如何在命令提示符窗口中列出按数字排序的目录中的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

命令列出文件夹中的所有文件以及窗口中的子文件夹

请模拟一下win10的cmd

#yyds干货盘点#ls命令按时间排序

如何按时间顺序列出文件?

linux如何查找以某个字母打头的文件或文件夹 比如,/etc目录下很多文件,我想列出所有以c开头的文件或文件

如何在 Linux 命令行中按大小对文件进行排序