Команда Windows Dir - упорядочить подкаталоги по размеру

Как я могу отобразить подкаталоги папки от самого большого к самому маленькому с помощью команды dir?

Я пробовал использовать команду dir /O:-S, и хотя она отлично сортирует файлы, кажется, что она не упорядочивает подкаталоги.

В идеале команда должна иметь возможность опускаться на несколько уровней; некоторые из этих подпапок имеют свои собственные папки. Например:

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

Предположим, что общий размер папки 1 (включая все файлы в ее подпапках) составляет 10 ГБ, а размер папки 2 — 15 ГБ, как мне вывести их порядок, отсортированный по общему размеру содержимого?

I.e.

94932485 Folder 2
6453445  Folder 1

Заранее спасибо!


person Julian Laval    schedule 18.08.2013    source источник


Ответы (5)


Кажется, это работает для измененных требований: измените 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"
person foxidrive    schedule 21.08.2013
comment
Спасибо! Несколько вопросов: 1) Как я мог получить размер в байтах? Приближение в ГБ было ненужным, я хотел использовать его в качестве примера файловой структуры, которую искал. 2) При запуске приведенного выше кода я заметил, что папки, которые на самом деле были МБ, отображались как ГБ (например, 659 МБ отображались как 659 ГБ). Просто то, что я подумал, стоит отметить. - person Julian Laval; 24.08.2013
comment
Да, это было накручено. Я отредактировал его, чтобы сообщить байты, и если вы хотите удалить запятые, удалите REM в начале строки. - person foxidrive; 24.08.2013

Если вам нужно однострочное решение, поддерживающее до 999 терабайт:

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
person sparks    schedule 10.09.2018
comment
Идеальное решение для одной линии! - person Kavinda Jayakody; 26.03.2020

EDITED: отображать папки от самых больших до самых маленьких

Посмотрите, это то, что вам нужно. 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"
person foxidrive    schedule 19.08.2013
comment
Я получаю сообщение об ошибке %%a was unexpected at this time. Аналогично для других переменных. Любые идеи? - person Julian Laval; 19.08.2013
comment
Как вы его запускали? Что вы поставили вместо d:\files ? Здесь это работает. Я подозреваю, что вы вставили его в командную строку, но это пакетный файл. - person foxidrive; 19.08.2013
comment
Ах, я действительно должен был запустить его как пакетный файл! Тем не менее, он по-прежнему не упорядочивает подпапки по размеру... - person Julian Laval; 19.08.2013
comment
О да, я слишком быстро прочитал ваш вопрос. Попробуйте мой отредактированный код. - person foxidrive; 20.08.2013
comment
Модифицированный код не решает проблему. Я пересмотрел свой вопрос, чтобы лучше объяснить себя. Бесконечно благодарю за помощь! - person Julian Laval; 21.08.2013
comment
Проблема в том, что вы хотите указать только размеры в ГБ? См. мое редактирование выше, чтобы узнать, что я вижу, когда использую его на своем диске. Это слишком отличается от того, что вам нужно? Изменить: я думаю, что вам нужны итоговые данные по каждой папке с подпапками, а не только по самой папке. Вам нужны итоги только на уровне одной папки? Например, вы указали folder 1 и проигнорировали Subfolder 1. - person foxidrive; 21.08.2013
comment
Ваш другой ответ отлично справляется со своей задачей! Большое спасибо! - person Julian Laval; 24.08.2013

Это довольно старый вопрос, но я не знаю, почему все мои друзья отвечают, что такой команды нет. Вот команда:

директор / о: с

Я видел комментарии о том, что он не работает с папками, по той же причине я редактирую свой ответ. Эта команда также поддерживает папки.

Я выполнил эту команду на своем локальном компьютере в одной папке, и ниже выводится

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

Помимо файлов, которые показывают размеры, мои папки тоже упорядочены. Когда я проверяю размер привязки; его почти 18 КБ; и последний репозиторий папок составляет почти 1 ГБ. Так что это работает и в папке.

person shaILU    schedule 30.10.2015
comment
Подробнее см. здесь: как использовать -dos.blogspot.in/2008/07/dos-commands-dir.html - person shaILU; 30.10.2015
comment
Это не работает для папок, только для файлов. Ваши друзья правы. - person katzenhut; 25.06.2016
comment
Нет @katzenhut ..... проверьте это. В одной из моих команд dir /o:s указано ниже: -----ВЫВОД ----- 01 июня 2016 г. 17:37 ‹DIR› привязка ›››удалены строки, так как они становятся слишком длинными 04- Май 2016 г. 12:20 ‹DIR› PocJms 26 мая 2016 г. 12:01 Репозиторий ‹DIR› 20 апреля 2016 г. 12:58 901 TestValidation.zip ›››удалены строки, так как они становятся слишком длинными 05 мая -2016 17:19 12,442,322 WMQ 8 JARS.zip -------------- Как упоминалось в выходных данных, привязка каталога имеет размер 18 КБ и репозиторий ~ 1 ГБ, поэтому он также организует подкаталог. Пожалуйста, проверьте. - person shaILU; 27.06.2016
comment
@katzenhut, в том числе. Пожалуйста, проверьте. И +1, если вы чувствуете себя хорошо. - person shaILU; 28.06.2016
comment
Я проверил. это не работает для меня. файлы упорядочены, а папки нет. судя по вопросу, у оп тоже не работает. понятия не имею, почему это, кажется, работает для вас. - person katzenhut; 28.06.2016
comment
Я попробовал Win 7 Professional Service Pack 1. Есть ли разница? - person shaILU; 28.06.2016
comment
Этот ответ просто отображает папки в алфавитном порядке, а это не то, что хотел исходный постер. - person Richard; 30.04.2018
comment
Richard в моей выходной папке не в алфавитном порядке. Можете ли вы проверить, и если все в порядке, верните +1 - person shaILU; 19.06.2019

Если вам не нужна дата и другая информация, вы можете использовать:

dir /b /a-d /o:s
person Ibrahim Akbar    schedule 19.04.2017
comment
Это не отображает размер файла - person Joel; 21.01.2019