Windows Dir命令 - 按大小排列子目录

13

如何使用dir命令将文件夹的子目录按大小从大到小显示?

我已尝试使用dir /O:-S命令,虽然它可以很好地排序文件,但似乎并没有对子目录进行排序。

理想情况下,该命令应该能够进入数个级别;其中一些子文件夹还有它们自己的文件夹。例如:

D:/
|-- Folder 1
    |-- Subfolder 1
    +-- Subfolder 2
        |--Another folder
+-- Folder 2

假设文件夹1(包括其所有子文件夹中的所有文件)的总大小为10GB,文件夹2的总大小为15GB,我该如何按照总内容大小输出它们的顺序?

即:

94932485 Folder 2
6453445  Folder 1

提前致谢!

5个回答

17

如果您需要一个支持最多999TB的一行解决方案:

cmd /v /c "set zeropad=000,000,000,000,000,&for /f "delims=" %a in ('dir /ad /b') do @set bytes=!zeropad!000&(for /f "tokens=3" %b in ('dir /s "%a" 2^>NUL ^| find "File(s)"') do @set bytes=%b)& @for /f "tokens=1* delims=," %c in ('echo !bytes!') do @(set bytes=%c&@set bytes=000!bytes!&@set bytes=!bytes:~-3!& @set bytes=!zeropad!!bytes!&if "%d" NEQ "" set bytes=!bytes!,%d) & @echo !bytes:~-23! %a" | sort /R

如果您想要同时获取文件和目录的奖励一行解决方案。

cmd /v /c "set zeropad=000,000,000,000,000,&for /f "tokens=4* delims= " %a in ('dir ^| find "/" ^| findstr /E /V /R "DIR^>[ ][ ]*\.\.$ DIR^>[ ][ ]*\.$"') do @set bytes=!zeropad!000&(if "%a" EQU "^<DIR^>" (for /f "tokens=3" %c in ('dir /s "%b" 2^>NUL ^| find "File(s)"') do @set bytes=%c)) & (if "%a" NEQ "^<DIR^>" (set bytes=%a)) & (for /f "tokens=1* delims=," %d in ('echo !bytes!') do @set bytes=%d&@set bytes=000!bytes!&@set bytes=!bytes:~-3!& @set bytes=!zeropad!!bytes!&if "%e" NEQ "" set bytes=!bytes!,%e)& echo !bytes:~-23! %b" | sort /R

完美的一行解决方案! - Kavinda Jayakody
通常在命令行中运行长命令而不知道它们实际在做什么是一个坏主意...但这个命令对我的目的来说很好用。谢谢,比下载一些程序来做这件事要好得多。 - Bilbo Baggins

9
这似乎适用于更改后的要求:将c:\folder更改为您想查询的文件夹级别。
@echo off
pushd "c:\folder"
for /f "delims=" %%a in (' dir /ad /b ') do call :size "%%~fa"
sort /r < "%temp%\dirsize.tmp"
del "%temp%\dirsize.tmp"
popd
pause
goto :eof

:size
for /f "tokens=3" %%b in ('dir /s "%~1" 2^>nul ^|find " File(s) "') do set "n=%%b"
set dirsize=%n%
REM set dirsize=%dirsize:,=%
set dirsize=                 %dirsize%
set dirsize=%dirsize:~-18%
>>"%temp%\dirsize.tmp" echo %dirsize% "%~1"

谢谢!有几个问题:1)我如何获取以字节为单位的大小?GB近似值是不必要的,我只是想用它作为我正在寻找的文件结构的示例。2)在运行上述代码时,我观察到实际上是MB的文件夹被显示为GB(例如659MB被显示为659GB)。这只是我认为值得注意的一些事情。 - Julian Laval
1
是的,它出了问题。我已经编辑过了,以报告字节,如果您想删除逗号,则删除行开头的 REM - foxidrive

2

编辑:按照文件夹大小从大到小显示

请看这是否符合您的需求,目标树为d:\files

@echo off
for /f "delims=" %%a in (' dir "d:\files" /ad /b /s ') do call :size "%%a"
sort /r < "dirsize.tmp"
del "dirsize.tmp"
popd
pause
goto :eof

:size
for /f "tokens=3" %%b in ('dir "%~1" 2^>nul ^|find " File(s) "') do (
for /f "tokens=1-4 delims=," %%c in ("%%b") do (
set dirsize=%%c%%d%%e%%f
)
)
set dirsize=                    %dirsize%
set dirsize=%dirsize:~-20%
>>"dirsize.tmp" echo %dirsize% "%~1"

这是我从中得到的一个样例:

这是一个示例,展示了我从中获得的内容:

        27982878 "d:\images\+ Funny and Odd pictures"
        22595308 "d:\images\+ Mostly Cats\20120917"
        16723196 "d:\images\+ Mostly Cats\20130215"
        10212204 "d:\images\+ Mostly Cats\20121104"
         9177080 "d:\images\+ Mostly Cats\20130506"
         8992465 "d:\images\+ Mostly Cats\20130814"
         8488502 "d:\images\Misc\Good Ideas"
         6985671 "d:\images\Misc\50 Life Hacks"
         5515548 "d:\images\Misc\Photos That Will Make Your Stomach Drop"
         2541431 "d:\images\Misc\Sci Fi"
         2113294 "d:\images\+ Mostly Cats\20130524"
          384100 "d:\images\Astronomy pics\3D"
               0 "d:\images\Misc"
               0 "d:\images\Astronomy pics"
               0 "d:\images\+ Mostly Cats"

我收到了错误信息 %%a在此处是意外的。其他变量也是如此。有什么想法吗? - Julian Laval
你是怎么运行它的?你在 d:\files 的位置放了什么?这里可以正常工作。我怀疑你把它粘贴到了命令提示符中,但它是一个批处理文件。 - foxidrive
啊,我确实应该将它作为批处理文件运行!然而,它似乎仍然没有按大小排序子文件夹... - Julian Laval
哦,是的,我太匆忙地读了你的问题。试试我的修改后的代码。 - foxidrive
修改后的代码似乎没有解决问题。我修改了我的问题以更好地解释自己。非常感谢您的帮助! - Julian Laval
显示剩余2条评论

1
这是一个相当陈旧的问题,但我不知道为什么我的所有朋友都回答说没有这样的命令。以下是命令:

dir /o:s

我看到有评论说它不能在文件夹上运行,出于同样的原因,我正在编辑我的答案。此命令也支持文件夹。

我在本地机器上的一个文件夹中运行了此命令,以下是输出结果:

d:\Moody>dir /o:s
 Volume in drive D is Data
 Volume Serial Number is CE51-A3E6

 Directory of d:\Moody

28-Jun-2016  11:22 AM    <DIR>          .
28-Jun-2016  11:22 AM    <DIR>          ..
01-Jun-2016  05:37 PM    <DIR>          binding
05-May-2016  06:29 PM    <DIR>          WMQ 8 JARS
27-Jun-2016  06:51 PM    <DIR>          codebase
27-Jun-2016  05:34 PM    <DIR>          docs
21-Jun-2016  11:12 AM    <DIR>          WMQ 7.5 JARS
18-May-2016  12:56 PM    <DIR>          TestValidation
17-Jun-2016  02:35 PM    <DIR>          java-doc-jms
17-May-2016  04:20 PM    <DIR>          sample-log
20-May-2016  03:28 PM    <DIR>          jms
26-May-2016  12:01 PM    <DIR>          repository
24-Jun-2016  12:09 PM    <DIR>          New folder
05-Apr-2016  04:55 PM    <DIR>          zips
04-May-2016  12:20 PM    <DIR>          PocJms
20-Apr-2016  12:58 PM               901 TestValidation.zip
22-Jun-2016  04:22 PM             7,739 team.xlsx
13-May-2016  09:19 PM             8,700 sample-log.zip
04-Jun-2016  03:06 PM            43,410 Sequence diagrams.mdj
28-Jun-2016  11:22 AM            59,392 FW Binding file for DEV QM.msg
02-May-2016  08:04 PM            81,568 PocJms.zip
21-Mar-2013  01:33 PM            99,926 fscontext-4.2.jar--
22-Jun-2016  02:31 PM           236,631 java-doc-jms.zip
05-May-2016  05:19 PM         7,673,675 WMQ 7.5 JARS.zip
05-May-2016  05:19 PM        12,442,322 WMQ 8 JARS.zip
              15 File(s)     21,028,409 bytes
              19 Dir(s)  73,162,878,976 bytes free

除了显示大小的文件外,我的文件夹也被排列好了。当我检查绑定的大小时,它近乎于18KB;最后一个文件夹存储库近乎于1GB。所以它也适用于文件夹。

请查看以下详细信息:http://how-to-use-dos.blogspot.in/2008/07/dos-commands-dir.html - shaILU
1
这个适用于文件,但不适用于文件夹。你的朋友是正确的。 - katzenhut
在我的dir命令中,dir /o:s 给出以下输出: -----OUTPUT----- 01-Jun-2016 05:37 PM <DIR> binding
由于答案变得太长,已删除若干行 04-May-2016 12:20 PM <DIR> PocJms 26-May-2016 12:01 PM <DIR> repository 20-Apr-2016 12:58 PM 901 TestValidation.zip 由于答案变得太长,已删除若干行 05-May-2016 05:19 PM 12,442,322 WMQ 8 JARS.zip

如输出所示,在目录中binding的大小为18 KB,而repository 的大小约为1GB,因此它也排列子目录。请检查。
- shaILU
1
我检查了一下,对我不起作用。文件已经排序,但文件夹没有排序。从问题来看,似乎对提问者也没有起作用。不知道为什么你似乎可以正常工作。 - katzenhut
这个答案只是按字母顺序显示文件夹 - 这不是原帖作者想要的。 - Richard
显示剩余3条评论

-2

如果您不需要日期和其他信息,可以使用:

dir /b /a-d /o:s

这不显示文件大小。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接