Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/10: Рейтинг темы: голосов - 10, средняя оценка - 5.00
jkadaba
78 / 0 / 1
Регистрация: 31.10.2016
Сообщений: 93
1

Размер каталога

09.09.2019, 13:55. Просмотров 1850. Ответов 11
Метки нет (Все метки)

Есть в Linux такая команда, du называется. В pwsh ее аналога нет. Как мне вывести размер вложенных каталогов и итоговый размер самой папки, в которой эти каталоги находятся. Пример вывода du:
Код
du -kh
24K   ./docs
36K   ./other
...
22M   .
Вот мы можем рекурсивно пройтись по каталогом, узнать размер файлов с помощью Get-ChildItem, затем сгруппировать каталоги. А дальше?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2019, 13:55
Ответы с готовыми решениями:

Вывести на экран содержимое каталога, размер файлов каталога, и создать новый файл
Ребята помогите создать программу на ассемблере , в которой нужно : вывести на экран содержимое...

скрипт, для рекурсивного обхода заданного каталога (полный путь+имя файла/каталога, размер, дата создания)
Только начинаю работать с Ruby. Работа с файловой системой. Вот нужен такой вот скрипт...

Posix решение размер каталога
Добрый день , гугель ничего не дал по запросу как в Linux подсчитать размер каталога . С файлом...

Невероятный размер каталога . Embarcadero/Studio
Простите за косвенное отношение к теме раздела.. Начал чистить системный диск и был несказанно...

Вычислить размер произвольного, указанного каталога
Вычислить размер произвольного, указанного каталога нужно под дос на тасм

11
KDE777
1598 / 1025 / 402
Регистрация: 22.01.2016
Сообщений: 2,850
09.09.2019, 16:40 2
Цитата Сообщение от jkadaba Посмотреть сообщение
от мы можем рекурсивно пройтись по каталогом, узнать размер файлов с помощью Get-ChildItem, затем сгруппировать каталоги. А дальше?
PowerShell
1
2
3
4
$report = Get-ChildItem -Path C:\Temp -File -Recurse | Group Directory | ForEach {[PScustomObject]@{DirName = $_.Name; Length= ($_.Group | Measure-Object Length -Sum).Sum}}
 
$report | Format-Table -AutoSize
"Total Size: $(($report | Measure-Object Length -Sum).Sum)"
1
YuS_2
Любознательный
1119 / 650 / 197
Регистрация: 10.03.2016
Сообщений: 1,504
09.09.2019, 17:52 3
Цитата Сообщение от jkadaba Посмотреть сообщение
Как мне вывести размер вложенных каталогов и итоговый размер самой папки, в которой эти каталоги находятся.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function get-foldersize {
    begin{$fso = new-object -com scripting.filesystemobject}
    process{
        [pscustomobject]@{
            Name = $_.name
            FullName = $_.fullname
            Size = ($fso.getfolder($_.fullname)).size
        }
    }
}
 
$fld = 'd:\TEST'
 
(dir $fld -rec -dir -force) + (gi $fld -force)|get-foldersize
1
greg zakharov
Нарушитель
2302 / 955 / 266
Регистрация: 07.05.2015
Сообщений: 1,874
09.09.2019, 21:39 4
Лучший ответ Сообщение было отмечено jkadaba как решение

Решение

Если имитировать du как есть, придется немного пошевелить мозгом с сортировкой папок (лучше всего это реализовать посредством стека). Если же просто нужна считалка размеров, можно нарисовать функцию примерно следующего содержания:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#requires -version 6
using namespace System.Linq
 
Set-Alias -Name du -Value Get-DirectoryUsage
function Get-DirectoryUsage {
  [CmdletBinding(DefaultParameterSetName='Path')]
  param(
    [Parameter(Mandatory,
               ParameterSetName='Path',
               Position=0,
               ValueFromPipeline,
               ValueFromPipelineByPropertyName)]
    [ValidateNotNullOrEmpty()]
    [SupportsWildcards()]
    [String]$Path,
 
    [Parameter(Mandatory,
               ParameterSetName='LiteralPath',
               Position=0,
               ValueFromPipelineByPropertyName)]
    [ValidateNotNullOrEmpty()]
    [Alias('PSPath')]
    [String]$LiteralPath
  )
 
  begin {
    if ($PSCmdlet.ParameterSetName -eq 'Path') {
      $PipelineInput = !$PSBoundParameters.ContainsKey('Path')
    }
 
    function private:Find-PathSize($Path) {
      process {
        $total = 0
        (Get-ChildItem $Path -File -Force -Recurse |
        Group-Object Directory).ForEach{
          $s = 'MK'[($sz = [Enumerable]::Sum([Int32[]]$_.Group.Length)) -lt 1Mb]
          $total += $sz
          [PSCustomObject]@{
            Size = "$([Math]::Round((($sz / 1Mb), ($sz / 1Kb))[$sz -lt 1Mb]))$s"
            Name = $_.Name
          }
        }
        "`e[032;1mОбщий размер: `e[33;1m$([Math]::Round(
          (($total / 1Mb), ($total / 1Kb))[($s = $total -lt 1Mb)], 1
        ))$('MK'[$s])`e[032;0m"
      }
    }
  }
  process {}
  end {
    .({Find-PathSize (Get-Item $LiteralPath)},{
      Find-PathSize ((Get-Item $Path -ErrorAction 0), $Path)[$PipelineInput]
    })[$PSCmdlet.ParameterSetName -eq 'Path']
  }
}
Округление в выводе значений поддиректорий осуществляется до целых, в итоговой сумме - до десятых.
2
09.09.2019, 21:39
jkadaba
78 / 0 / 1
Регистрация: 31.10.2016
Сообщений: 93
10.09.2019, 08:25  [ТС] 5
YuS_2, а где, собственно, комы в линухе?
KDE777, о measure я тоже думал, но во-первых данные гоняются через пайп, во-вторых sum не факт что вернёт корректное значение. Просто уже сталкивался на практике с подобным.
greg zakharov, а проще?
0
KDE777
1598 / 1025 / 402
Регистрация: 22.01.2016
Сообщений: 2,850
10.09.2019, 10:44 6
Лучший ответ Сообщение было отмечено jkadaba как решение

Решение

Цитата Сообщение от jkadaba Посмотреть сообщение
данные гоняются через пайп, во-вторых sum не факт что вернёт корректное значение.
Пайпы меняем на ForEach, а вместо Measure-Object, складываем столбиком

PowerShell
1
2
3
4
5
6
$report = (Get-ChildItem -Path C:\Temp -File -Recurse | Group Directory).ForEach{$s=0;$_.Group.ForEach{$s+=$_.Length};[PScustomObject]@{DirName=$_.Name;Length=$s}}
$report | Format-Table -AutoSize
 
$s=0; $report.ForEach{$s+=$_.Length}
 
"Total Size: $s"
Добавлено через 15 минут
Цитата Сообщение от jkadaba Посмотреть сообщение
а проще?
А если взглянуть на содержимое "du.c", то мы увидим 1139 строчек кода и получается, что у greg zakharov получилось попроще
1
bidstrup
330 / 147 / 22
Регистрация: 11.03.2018
Сообщений: 656
10.09.2019, 14:19 7
greg zakharov,
Всё хорошо, но неплохо бы обрабатывать ошибку доступа в чужие каталоги.
И итог под macos выглядит вот так:
���������� ������������ 26816.4M
0
greg zakharov
Нарушитель
2302 / 955 / 266
Регистрация: 07.05.2015
Сообщений: 1,874
10.09.2019, 15:38 8
bidstrup, минимум правок - вперед! Что же до макоси, не работал с ней и не ориентируюсь на нее.
0
YuS_2
Любознательный
1119 / 650 / 197
Регистрация: 10.03.2016
Сообщений: 1,504
16.09.2019, 13:21 9
Цитата Сообщение от jkadaba Посмотреть сообщение
а где, собственно, комы в линухе?
А при чем тут linux?
Мы тут в каком разделе сейчас находимся?

Ну, в принципе, есть ещё такой, уже существующий код:
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$watch = [system.diagnostics.stopwatch]::startnew() #таймер
$watch.start() #запуск таймера
 
function Get-SizeDirectory {
    param (
        [parameter(ValueFromPipeline=$true)]
        [string[]]$arr
    )
    process {
        foreach ($item in $arr) {
            try {
                $tmp = gi $item -ea 1
                $math = dir -lit $tmp.fullname -rec -force|
                    ?{!$_.psiscontainer}|measure -prop length -sum
                [pscustomobject]@{
                    Name = $tmp.name #Имя каталога
                    Fullname = $tmp.fullname #Абсолютный путь с именем
                    Count = $math.count #Счетчик файлов в каталоге, рекурсивно
                    Size = "{0:G}" -f ($math.sum/$k) #Размер каталога
                }
            } catch {
                ('{0:dd.MM.yy HH:mm:ss}' -f (get-date)),$_|
                out-file $logerr -enc utf8 -app
            }
        }
    }
}
 
#Перечисление каталогов непосредственно в скрипте:
#для использования, блок раскомментировать, при этом, необходимо
#закомментировать обе строки получения массива из файла ниже
$fld = @(
    'd:\distr',
    'd:\downloads',
    'd:\111' 
    #и т.д.
)
 
#Либо получение массива каталогов из текстового файла (один каталог на строку):
#$file = 'd:\folders.txt'
#$fld = gc $file -enc utf8
 
#Коэффициент единиц размера каталогов (на выбор: <1|1Kb|1Mb|1Gb|1Tb>):
$k = '1Gb'
 
#Файл .csv с результатом:
$out = 'result.csv'
 
#Лог-файл ошибок:
$logerr = 'error.log'
 
 
$fld|get-sizedirectory|select fullname,count,size|
convertto-csv -not -del ';'|out-file $out -enc utf8
 
$watch.stop() #остановка таймера
$watch.elapsed >execution_speed.txt #время выполнения

но суть его сводится к тому же, что и в этом сообщении, только без группировки, потому и приводить его не стал...
а список каталогов можно получать по:
PowerShell
1
dir $path -dir -rec
и подавать его на вход функции в качестве $fld.fullname
Корневой каталог тоже можно конкатенировать к массиву... его размер и будет общим размером, включая подкаталоги... в общем, простор для творчества есть.
0
jkadaba
78 / 0 / 1
Регистрация: 31.10.2016
Сообщений: 93
16.09.2019, 13:41  [ТС] 10
YuS_2, а ты видел где-нибудь в разделе линуха тему о pwsh? Где мне еще вопрос задавать как ни здесь. Так что линух при том при всем.
0
volodin661
2224 / 1009 / 169
Регистрация: 10.12.2013
Сообщений: 3,374
16.09.2019, 17:54 11
Цитата Сообщение от jkadaba Посмотреть сообщение
YuS_2, а где, собственно, комы в линухе?
Ну, строго говоря, комы в линухе, конечно, имеются.

Но jkadaba всё равно прав, будучи ТС он сразу употребил волшебное слово pwsh,
которое ныне является флагом кроссплатформенности.
0
YuS_2
Любознательный
1119 / 650 / 197
Регистрация: 10.03.2016
Сообщений: 1,504
17.09.2019, 11:14 12
Цитата Сообщение от jkadaba Посмотреть сообщение
Где мне еще вопрос задавать как ни здесь.
Ну, за спрос, по фейсу не бьют, как известно
Просто, надо помнить, что здесь ответы, скорее всего, будут применительно к windows... поэтому придется их фильтровать самостоятельно, ибо проверить не на чем иногда, кроме win, либо сразу конкретизировать место установки pwsh, чтобы не получить лишней инфы...

Цитата Сообщение от volodin661 Посмотреть сообщение
волшебное слово pwsh
да, я видел и не менее волшебное слово linux, тоже видел, но то, что pwsh установлен на linux... домысливать не стал, ибо раздел предполагает совсем не его.
0
17.09.2019, 11:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2019, 11:14

Как получить размер каталога с подкаталогами?
Задача стоит следующая - сбор статистики по профилям учетных записей на рабочих станциях (Использую...

Вывести суммарный размер в байтах файлов каталога
Написать командный сценарий для интерпретатора bash, который выводил бы суммарный размер в байтах...

Удаления файлов с каталога ( и подкаталогов) если размер больше 5 Гб
Добрый день. Перепробовал на форуме все скрипты, но не работаю так как надо. Задачка простая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.