Команда du неправильно подсчитывает размер папки

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Друзья! Только что установил старый debian на старый компьютер. Размер / в байтах

Shell

root@debian:~# du -s -b /
du: невозможно получить доступ к «/proc/4699/task/4699/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4699/task/4699/fdinfo/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4699/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4699/fdinfo/3»: Нет такого файла или каталога
5396469680 /
root@debian:~#
Offtopic
Какого рожна du лезет к несуществующим процессам- это второй вопрос.
Тут же округляем размер:

Shell

root@debian:~# du -s -H /
du: невозможно получить доступ к «/proc/4703/task/4703/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4703/task/4703/fdinfo/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4703/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/4703/fdinfo/3»: Нет такого файла или каталога
3619672 /
root@debian:~#
Вот вообще несмешной прикол. Читаем man

Shell

man du
...
-h, --human-readable
Добавлять букву размера, например M для двоичного мегабайта (`мебибайт'), к каждому размеру.

-H, --si
Делает то же, что и опция -h, но использует официальные единицы измерения SI (где для расчетов
используется 1000 вместо 1024 и, таким образом, M - это 1000000 вместо 10485576). (Новое в file‐
utils-4.0.)
То есть единственное, что требовалось от последней команды, это безошибочно разделить 5396469680 на тыщу и получить 5396469, а оно получило 3619672 (я грешным делом думал, оно разделит на 1000000 или даже 1000000000 и букву какую-нибудь прибавит, например, так:
5,3G
но это я уж лишку понадеялся)

Да так вот. Почему же выходит 3619672 вместо 5396469? Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5039
ОС: Gentoo

Re: Команда du неправильно подсчитывает размер папки

Сообщение /dev/random »

Я понятия не имею, откуда вы берёте такие маны. Уже не первый раз вижу, что в ваших цитатах из манов ошибки, а в манах у меня на компе этих ошибок нет. Не знаю уж, выдумываете ли вы это всё, или вашему дистрибутиву пора на помойку.

man du

-D, --dereference-args
dereference only symlinks that are listed on the command line
...
-H equivalent to --dereference-args (-D)
...
--si like -h, but use powers of 1000 not 1024
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16834
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Команда du неправильно подсчитывает размер папки

Сообщение Bizdelnick »

Нельзя верить русским переводам манов. Они писались много лет назад и давно устарели.
жучара писал(а):
17.12.2019 12:57
установил старый debian
Если бы установили новый, проблемы бы не было: из него manpages-ru давно выкинули. Рекомендую снести этот пакет или, если с английским совсем плохо, хотя бы сверяться с оригиналом.
LANG=C man du
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3023
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Команда du неправильно подсчитывает размер папки

Сообщение Hephaestus »

жучара писал(а):
17.12.2019 12:57
я грешным делом думал, оно разделит на 1000000 или даже 1000000000 и букву какую-нибудь прибавит, например, так:
5,3G
Для этого надо строчную букву h:
du -sh
жучара писал(а):
17.12.2019 12:57
3619672 вместо 5396469?
Так сразу не ответишь.

Во-первых, у Вас определяется размер от корня, а в корне могут быть всякие динамические штуки (вроде тех же файлов в /proc), размер их может меняться в процессе работы, короче говоря. Поэтому, запуская du несколько раз, будете получать разные результаты.

Во-вторых, я вижу в man-странице несколько другие сведения: ключ --si и ключ -H делают совершенно разные вещи. В Вашей man-странице они совмещены. Скорее всего, это зависит от версии, но всё же попробуйте ключ --si (в смысле эксперимента так будет более однозначно).

В-третьих, лично у меня есть сомнения, в каких единицах суммируются размеры при ключе --si.
Если суммируется в байтах и потом переводится в другие единицы - это будет одно. Если же размер каждого файла переводится, а потом суммируется - это будет немного другое.

Вывод: Попрбуйте в порядке эксперимента ограничиться каким-то одним каталогом с небольшим постоянным количеством файлов и желательно с заранее известным суммарным размером. Запустите du несколько раз с различными ключами, посмотрите, будут ли расхождения.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
olecya
Сообщения: 124
ОС: debian, fedora (i3-wm)

Re: Команда du неправильно подсчитывает размер папки

Сообщение olecya »

Думаю вы забыли прочитать man по опции -b
Добавлено (14:00):
Я была не права, все дело в /proc

Код: Выделить всё

du -s -b --exlude=/proc /
Добавлено (14:08):
В моей системе размер блоков файлов отличается от файлов в /proc в 4 раза, утилита с опцией -b все таки считает
размер не байтами а блоками и выполняет арифметику
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Выяснил, что всё работает не очень хорошо.

Shell

user@debian:~$ sudo du -s -b /
du: невозможно получить доступ к «/proc/18305/task/18305/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18305/task/18305/fdinfo/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18305/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18305/fdinfo/3»: Нет такого файла или каталога
5355234598 /
user@debian:~$
Откуда берётся величина 5355234598?

Такая вот величина суть сумма подобных величин для подпапок первого уровня + размер всех файлов первого уровня. Плюс 4096. Ну то есть если в папке foo будет две подпапки foo_0 и foo_1 и файл bar размером 100 байт, то du -s -b foo выдаст 100 + (du для foo_0) + (du для foo_1) + 4096.

Мне вообще неочевидно это ни разу. На практике не забываем про скрытые файлы.

+++++++++++++++++++++++++++++++++++++++++++++++++++++

То, что я ожидал увидеть, достигается (?)

Shell

user@debian:~/$
user@debian:~/$ sudo du -s -b -h /
du: невозможно получить доступ к «/proc/18322/task/18322/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18322/task/18322/fdinfo/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18322/fd/3»: Нет такого файла или каталога
du: невозможно получить доступ к «/proc/18322/fdinfo/3»: Нет такого файла или каталога
5,0G /
user@debian:~/Рабочий стол$
Но, вообще говоря, достижение так себе. Ибо:
5355234598/(2^30)=4.9
5355234598/(10^9)=5.3
А у них 5.0. Проще самому делить

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Без опции -b опцию -h использовать нельзя (это не написано!). Ибо они тупо округляют слагаемые

Shell

user@debian:~$ sudo du -h /
652K /boot/grub/locale
2,4M /boot/grub
17M /boot
12K /lib/crda/pubkeys
28K /lib/crda
4,0K /lib/systemd/system/sockets.target.wants
4,0K /lib/systemd/system/poweroff.target.wants
4,0K /lib/systemd/system/multi-user.target.wants
4,0K /lib/systemd/system/halt.target.wants
4,0K /lib/systemd/system/dbus.target.wants
4,0K /lib/systemd/system/basic.target.wants
4,0K /lib/systemd/system/reboot.target.wants
140K /lib/systemd/system
...
user@debian:~$
Так, и после обработки этой бальды получаются такие слагаемые:
17M
105M
1,1M
4,0K
4,0K
3,2G
4,0K
7,4M
174M
4,0K
28K
48K
0
16K
8,4M
7,2M
0
4,0K
52M
16K
0
В общем, в сумме 3.5 где-то и получается, в гробу я видал такой способ

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Опция --si. Эффект должен быть виден на папках размером больше гига, что-то у меня не особо видно

Shell

user@debian:~/$
user@debian:~/$ sudo du -s --si -b -h / 2>/dev/null
5,1G /
user@debian:~/$ sudo du -s -b -h / 2>/dev/null
5,1G /
user@debian:~/$ sudo du -s -b / 2>/dev/null
5428949571 /
user@debian:~/$
Проще самим разделить. Но я писал уже

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Опция -H,

Shell

LANG=C man du
...

-D, --dereference-args
dereference only symlinks that are listed on the command line

-H equivalent to --dereference-args (-D)

Различает только символические ссылки, перечисленые в командной строке. Я ведь правильно перевёл?

Shell

user@debian:~/$ sudo du -s -b -H /home 2>/dev/null
57162543 /home
user@debian:~/$
Э, да чего уж там говорить.

+++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++

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

http://linuxshare.ru/projects/trans/mans.html
http://linuxshare.ru/projects/trans/manpages-ru-0.98.tar.bz2

Я сам ничё не придумал. И дистрибутив меньше всего мой. Здесь брал.

https://cdimage.debian.org/cdimage/archive/7.11.0/i386/bt-dvd/

Такие дела.

+++++++++++++++++++++++++++++++++++++++++++++++++++++
Bizdelnick писал:
17.12.2019 13:16
Если бы установили новый, проблемы бы не было: из него manpages-ru давно выкинули. Рекомендую снести этот пакет или, если с английским совсем плохо, хотя бы сверяться с оригиналом.
LANG=C man du
Звучит как издевательство. Вы думаете, я не пробовал новый дистрибутив? Там ещё хуже. Он устанавливаться устанавливается, а работать не работает. Долгая коляска, короче. А я вообще стараюсь ничё не доустанавливать, никаких манов, никаких пакетов, ну его. Просто при установке указываю "ru" (но только при установке!), там, где спрашивают, вот и получаю то, что получаю. Увидь я ман на английском, я бы читал его на английском, тем более, он не труден.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16834
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Команда du неправильно подсчитывает размер папки

Сообщение Bizdelnick »

жучара писал(а):
17.12.2019 22:50
5355234598/(2^30)=4.9
Вообще-то 4.98745087347924709320. Если округлять до одного знака после запятой, то 5,0.
жучара писал(а):
17.12.2019 22:50
Без опции -b опцию -h использовать нельзя (это не написано!). Ибо они тупо округляют слагаемые.
Бред. В мане (англоязычном, по крайней мере) объясняется, в чём разница, и нет, она не в округлении.
жучара писал(а):
17.12.2019 22:50
В общем, в сумме 3.5 где-то и получается, в гробу я видал такой способ
Правильно, там ему и место. Если интересует сумма, используйте опцию -s, а не складывайте округлённые значения.
жучара писал(а):
17.12.2019 22:50
Опция --si. Эффект должен быть виден на папках размером больше гига, что-то у меня не особо видно
А у меня видно:

Shell

% du -sh ~/downloads
341G /home/user/downloads
% du -s --si ~/downloads
366G /home/user/downloads
%
Возможно, дело в версии du, но вообще, погрешность в Вашем случае слишком большая. В корне слишком много файлов постоянно создаются и удаляются не то что между двумя запусками, но и между чтением содержимого каталога и получением информации о месте, занимаемом файлами внутри него, в ходе одного запуска, что Вы, вроде бы, заметили на примере /proc.
жучара писал(а):
17.12.2019 22:50
Теперь по форме. Значит, маны эти чьи угодно, но не мои. В моих инструкциях такой лжи не бывает.
Потому что их нет, Ваших инструкций?
Вот к чему Вы всё это пишете, а? Сказано же: не обновлялись они много лет, всё поменялось. Когда-то они чему-то соответствовали, сейчас — превратились в мусор. Это не ложь, это правдивая, но неактуальная информация. Переведите свежие версии, осчастливьте человечество. Тогда у Вас будет моральное право рассуждать об их качестве.
жучара писал(а):
17.12.2019 22:50
Звучит как издевательство. Вы думаете, я не пробовал новый дистрибутив? Там ещё хуже. Он устанавливаться устанавливается, а работать не работает.
Конечно, все только и хотят над Вами поиздеваться. И маны неправильные подсовывают, и дистрибутивы ломают. А сами, небось, сидят с правильными манами на работающем дистрибутиве, но тщательно от Вас их скрывают.
Так, что ли, по-Вашему?

Знаете, жучара, я хочу Вам рассказать одну вещь, которой Вас родители почему-то, видимо, не научили. Если Вам дали пользоваться результатами своего труда, как-то помогли, ответили на вопрос… В таки случаях надо говорить «спасибо», а не претензии предъявлять.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5039
ОС: Gentoo

Re: Команда du неправильно подсчитывает размер папки

Сообщение /dev/random »

жучара писал(а):
17.12.2019 22:50
Такая вот величина суть сумма подобных величин для подпапок первого уровня + размер всех файлов первого уровня. Плюс 4096. Ну то есть если в папке foo будет две подпапки foo_0 и foo_1 и файл bar размером 100 байт, то du -s -b foo выдаст 100 + (du для foo_0) + (du для foo_1) + 4096.

Мне вообще неочевидно это ни разу.
Не используйте термин "папка", и всё будет очевидно. Каталог - это не контейнер (на что указывал бы термин "папка"), а список. Как библиотечный каталог. Сами файлы лежат не в каталоге, а просто в файловой системе, и имеют не имена, а номера инодов, а каталог - это список в форме "имя-номер, имя-номер". И этот список сам является файлом и занимает место на диске (в ext* - не менее 4096 байт), которое и прибавил ваш du. Эта разница ОЧЕНЬ важна для понимания линукса. Хардлинки, анонимные файлы, удаление открытых файлов и т.д. - огромное количество возможностей линукса почти невозможно правильно понять, если думать о каталогах как о контейнерах, а не списках.
жучара писал(а):
17.12.2019 22:50
Различает только символические ссылки, перечисленые в командной строке. Я ведь правильно перевёл?
Нет. "Dereference" означает "переходить по симлинкам" (или формально, "разыменовывать"), и не-симлинки эта опция никак не затрагивает. Полное описание переводится так: "Переходить только по тем симлинкам, которые указаны в командной строке." Другим словами, если симлинк встретится в процессе рекурсивного обхода каталогов, не переходить по нему.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Bizdelnick писал:
18.12.2019 00:58
жучара писал(а):
17.12.2019 22:50
Без опции -b опцию -h использовать нельзя (это не написано!). Ибо они тупо округляют слагаемые.
Бред. В мане (англоязычном, по крайней мере) объясняется, в чём разница, и нет, она не в округлении.
Чё сразу бред-то? Было:

Shell

-b, --bytes
Выдавать размеры в байтах вместо килобайтов.
Стало

Shell

--apparent-size
print apparent sizes, rather than disk usage; although the apparent size is usually smaller, it may be larger due to holes in (`sparse') files, internal fragmentation, indirect blocks, and the like

-B, --block-size=SIZE
scale sizes by SIZE before printing them. E.g., `-BM' prints sizes in units of 1,048,576 bytes. See SIZE format below.

-b, --bytes
equivalent to `--apparent-size --block-size=1'
Ну извините, такую разницу между объяснениями опций я и представить не мог. Да, опция могла измениться. Вопрос- зачем? Была отличная опция -b, а во что превратилась? Если уж решили такой функционал мудрёный сделать, у них других букв что ли не было? В любом случае их дела, а английский man не прочёл я.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

А теперь прочёл. Если используем опцию -b, то получаем какие-то видимые размеры вместо используемых. Причём видимые меньше используемых.
print apparent sizes, rather than disk usage; although the apparent size is usually smaller,

Вопрос- а как же используемые-то получить? Ну вот те которые больше (с учётом динамики, с учётом что у меня полуторагиговые байты между двумя запусками программ создаются и так далее и тому подобное)

Наверное, нужно не использовать -b и тогда получу вожделенную usage, которая больше.
Итак, сперва получаем видимые размеры, которые меньше используемых

Shell

user@debian:~$
user@debian:~$ sudo du -s -b / 2>/dev/null
5433645264 /
user@debian:~$
А теперь получаем ...э.... другие размеры. Они, наверное, должны быть больше предыдущих?

Shell

user@debian:~$ sudo du -s / 2>/dev/null
3658844 /
user@debian:~$
Ну ладно, чё. Пошёл думать над этим всем.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16834
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Команда du неправильно подсчитывает размер папки

Сообщение Bizdelnick »

жучара писал(а):
18.12.2019 13:29
Вопрос- а как же используемые-то получить?
Не использовать опцию -b. У Вас разве размер кластера не кратен килобайту? Большей точности Вы всяко не получили бы.
жучара писал(а):
18.12.2019 13:29
А теперь получаем ...э.... другие размеры. Они, наверное, должны быть больше предыдущих?
С какой стати? С опцией -b (точнее, --apparent-sizes) учитывается, в числе прочего, размер файлов в /dev, /proc, /sys и т. п. А места на диске они, разумеется, не занимают.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Bizdelnick писал:
18.12.2019 13:48
С какой стати? С опцией -b (точнее, --apparent-sizes) учитывается, в числе прочего, размер файлов в /dev, /proc, /sys и т. п. А места на диске они, разумеется, не занимают.
а в man-e по-другому написано:

Shell

print apparent sizes, rather than disk usage; although the apparent size is usually smaller,
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16834
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Команда du неправильно подсчитывает размер папки

Сообщение Bizdelnick »

Всё правильно написано, usually smaller. Когда речь об обычном файле на диске идёт. Да и то с оговоркой после запятой, которую Вы опустили.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8253
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Команда du неправильно подсчитывает размер папки

Сообщение serzh-z »

жучара писал(а):
18.12.2019 13:29
Ну извините, такую разницу между объяснениями опций я и представить не мог.
Вот же паразиты эти русские переводчики. Никак им заплатили, чтобы оболгать вас и сорвать рабочий процесс.
Добавлено (17:34):
Я так понимаю, что речь идёт про какой-то очередной бородатый man из тех, что есть на OpenNet, про которые уже столько написано... Мало того, что перевод, что очевидно, зачастую отстаёт от оригинала и привносит ошибки, так ещё в нем явно указано про то, что перевод может содержать ошибки.
Спасибо сказали:

Аватара пользователя
bormant
Сообщения: 1231

Re: Команда du неправильно подсчитывает размер папки

Сообщение bormant »

Чтобы не пытаться считать что ни попадя, тот же /proc, есть смысл использовать -x, она же --one-file-system, перечисляя в командной строке точки монтирования отдельных ФС, несущих данные.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

serzh-z писал:
18.12.2019 17:08
Я так понимаю, что речь идёт про какой-то очередной бородатый man из тех, что есть на OpenNet, про которые уже столько написано...
Он с дистрибутивом debian идёт. Про ошибки ничего не сказано.

++++++++++++++++++++++++++++++++++++++++++++++++++++++

Чуть-чуть разобрался. Для себя пишу.
Как работает
1) (по опции -b разговор ниже, пока предполагаем, что просто количество байт)

Shell

user@debian:~$ du -b
4096 ./bar/bar_0/bar_5
8192 ./bar/bar_0
4181 ./bar/bar_1/bar_2/bar_3/bar_4
8277 ./bar/bar_1/bar_2/bar_3
12373 ./bar/bar_1/bar_2
16469 ./bar/bar_1
28757 ./bar
1279137 .
user@debian:~$
Как получается величина 1279137? Правильно говорить величина 1279137 для директории такой-то (в данном случае текущей). Так вот, эта величина есть сумма (подобных величин для поддиректорий первого уровня, размеров файлов первого уровня и 4096)

В данном случае подобные величины для поддиректорий первого уровня есть 28757 (для дирекории ./bar первого уровня)

Сумму всех файлов первого уровня можно посмотреть так:

Shell

user@debian:~$ ls -l
итого 1260
drwxr-xr-x 4 user user 4096 Дек 17 2019 bar
-rw-r--r-- 1 user user 611038 Дек 17 2019 dubg.txt
-rw-r--r-- 1 user user 21 Дек 17 19:18 dubr_.txt
-rw-r--r-- 1 user user 175 Дек 17 2019 dubr.txt
-rw-r--r-- 1 user user 626762 Дек 17 18:25 dub.txt
-rwxr-xr-x 1 user user 165 Дек 17 2019 f_0.sh
-rw-r--r-- 1 user user 0 Дек 17 13:46 foo
-rwxr-xr-x 1 user user 73 Дек 17 19:22 f.sh
-rw-r--r-- 1 root root 559 Дек 17 02:44 gr.txt
lrwxrwxrwx 1 user user 4 Дек 18 2019 io -> f.sh
-rw-r--r-- 1 user user 11 Дек 17 19:02 rb.txt
-rw-r--r-- 1 user user 27 Дек 17 2019 rm
-rw-r--r-- 1 root root 838 Дек 17 02:42 sources.list
-rw-r--r-- 1 user user 6611 Дек 18 2019 tx.txt
user@debian:~$
(обращаю внимание, размер io суть 4 байта)

4096 это, я так понимаю, отводится для служебной информации самой текущей папки. Итого и получаем 1279137

Можно вот так посмотреть ВСЁ, и размеры файлов тоже. Тут главное, не запутаться.

Shell

user@debian:~$ du -b -a | sort --k=2
1279137 .
28757 ./bar
8192 ./bar/bar_0
4096 ./bar/bar_0/bar_5
16469 ./bar/bar_1
12373 ./bar/bar_1/bar_2
8277 ./bar/bar_1/bar_2/bar_3
4181 ./bar/bar_1/bar_2/bar_3/bar_4
85 ./bar/bar_1/bar_2/bar_3/bar_4/fff
611038 ./dubg.txt
21 ./dubr_.txt
175 ./dubr.txt
626762 ./dub.txt
165 ./f_0.sh
0 ./foo
73 ./f.sh
559 ./gr.txt
4 ./io
11 ./rb.txt
27 ./rm
838 ./sources.list
6611 ./tx.txt
user@debian:~$


2) Чтобы исключить какой-либо путь, нужно написать

Shell

user@debian:~$ du -b --exclude=./bar/bar_1/bar_2
4096 ./bar/bar_0/bar_5
8192 ./bar/bar_0
4096 ./bar/bar_1
16384 ./bar
1266764 .
user@debian:~$
Что даёт и как работает: изначально папка bar_2 входит в папку bar_1.

Shell

user@debian:~$ du -b
4096 ./bar/bar_0/bar_5
8192 ./bar/bar_0
4181 ./bar/bar_1/bar_2/bar_3/bar_4
8277 ./bar/bar_1/bar_2/bar_3
12373 ./bar/bar_1/bar_2
16469 ./bar/bar_1
28757 ./bar
1279137 .
user@debian:~$
Делаем два шага: из du -s -b bar_1 просто-напросто исключаем du -s -b bar_2, то есть: новая величина du -s -b bar_1 равна 16469−12373=4096
Второй шаг- визуально исключаем строки с ./bar/bar_1/bar_2

3) По опции -b
Я так понимаю, в данном контексте (относительно опции -b) существуют два размера и у файла и у папки. Видимый и фактический (второй не знаю, вычисляется динамически или хранится статически).
Сказано, что -b равна совокупности опций --apparent-size --block-size=1
Переводится так: берётся видимый размер делится на размер блока и выводится количество блоков (по факту байтов, иначе округление ВСЕГДА идёт в большую сторону.
Offtopic
Если специально себя не запутывать, то в мане вполне бы сошло ненавистное

Shell

-b, --bytes
Выдавать размеры в байтах вместо килобайтов.
Но даже если себя специально запутывать, всё рано такое пояснение тоже имело право на существование, опционально хотя бы. Но уж если совсем-совсем себя запутывать, тогда да, только --apparent-size --block-size=1, по-другому-то не объяснить ведь.
)

Shell

user@debian:~$ du -b dubg.txt
611038 dubg.txt
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1 dubg.txt
611038 dubg.txt
user@debian:~$
user@debian:~$ du --apparent-size --block-size=2 dubg.txt
305519 dubg.txt
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1K dubg.txt
597 dubg.txt
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1KB dubg.txt
612 dubg.txt
user@debian:~$
То же, но с папкой foo.

Shell

user@debian:~$ ls -l foo
итого 600
-rw-r--r-- 1 user user 611038 Дек 17 22:25 dubg.txt
user@debian:~$
Вспоминаем, откуда берётся du -b foo (см. пункт 1) и проверяем:

Shell

user@debian:~$ du -b foo
615134 foo
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1 foo
615134 foo
user@debian:~$
user@debian:~$ du --apparent-size --block-size=2 foo
307567 foo
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1K foo
601 foo
user@debian:~$
user@debian:~$ du --apparent-size --block-size=1KB foo
616 foo
user@debian:~$


Если не использовать -b, то на размер блока будет делиться будет фактический размер (далее аргумент --block-size=1K по умолчанию)

Shell

user@debian:~$
user@debian:~$ du --block-size=1 dubg.txt
614400 dubg.txt
user@debian:~$
user@debian:~$ du --block-size=2 dubg.txt
307200 dubg.txt
user@debian:~$
user@debian:~$ du --block-size=1K dubg.txt
600 dubg.txt
user@debian:~$
user@debian:~$ du --block-size=1KB dubg.txt
615 dubg.txt
user@debian:~$
Тот же эксперимент, но с папкой. Похоже, фактический размер папки определяется так: берётся видимый размер папки (в нашем случае 615134) и увеличивается вверх до величины, кратной 4096. Дальнейшие пляски от него.

Shell

user@debian:~$
user@debian:~$ du -b foo
615134 foo
user@debian:~$
user@debian:~$ du --block-size=1 foo
618496 foo
user@debian:~$
user@debian:~$ du --block-size=2 foo
309248 foo
user@debian:~$
user@debian:~$ du --block-size=1K foo
604 foo
user@debian:~$
user@debian:~$ du --block-size=1KB foo
619 foo
user@debian:~$


4) Почему при использовании -b выводимые цифры меньше, понятно. Но иногда они могут быть больше. И сильно больше.

Shell

user@debian:~$
user@debian:~$ sudo du -s -b / 2>/dev/null
5439159451 /
user@debian:~$
user@debian:~$ sudo du -s --block-size=1 / 2>/dev/null
3751288832 /
user@debian:~$
Разберём, почему.

Shell

user@debian:~$ sudo du -s -b /proc 2>/dev/null
1067972632 /proc
user@debian:~$
user@debian:~$ sudo du -s /proc 2>/dev/null
0 /proc
user@debian:~$
Это как пример. В общем, не совсем понятно, почему размеры содержимого папки /proc они вдруг отнесли к категории видимых размеров. Видать, от противного. Размеры точно не фактические, а раз третьей категории не представлено, пусть будут видимыми. Ну, пускай их.

5) --si и -h ответственны просто за добавление буквы. За вычисление ответственна неявно добавляемая опция --block-size (как на самом деле, не совсем ясно, но оно и неважно по большому счёту, если уж совсем-совсем-пресовсем не вникать.)

Shell

user@debian:~$
user@debian:~$ du --block-size=1K dubg.txt
600 dubg.txt
user@debian:~$
user@debian:~$ du -h dubg.txt
600K dubg.txt
user@debian:~$
user@debian:~$ du --block-size=1KB dubg.txt
615 dubg.txt
user@debian:~$
user@debian:~$ du --si dubg.txt
615k dubg.txt
user@debian:~$
Как-то так. Всем спасибо. Если что, тут спрошу.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8253
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Команда du неправильно подсчитывает размер папки

Сообщение serzh-z »

жучара писал(а):
18.12.2019 22:35
Похоже, фактический размер папки определяется так: берётся видимый размер папки (в нашем случае 615134) и увеличивается вверх до величины, кратной 4096.
Фактический размер возвращает драйвер файловой системы и 4096 означает всего лишь что размер блока на используемой файловой системе - 4096 байт. Любой объект будет занимать не меньше одного блока.
жучара писал(а):
18.12.2019 22:35
В общем, не совсем понятно, почему размеры содержимого папки /proc они вдруг отнесли к категории видимых размеров.
Потому что с точки зрения VFS - /proc имеет размер (а `--apparent-size` запрашивает именно его), но на файловой системе /proc занимает 0 блоков (без `--apparent-size` считаются они).
жучара писал(а):
18.12.2019 22:35
--si и -h ответственны просто за добавление буквы. За вычисление ответственна неявно добавляемая опция --block-size
Обе опции, помимо прочего, просто сбрасывают `--block-size` в 1.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Имеем regular файл размером 1 гиг

Shell

user@astra:~$ ls -l 1G_
-rw-r--r-- 1 user user 1073741824 янв. 2 23:34 1G_
Этот размер можно посмотреть и так:

Shell

user@astra:~$ du -b 1G_
1073741824 1G_
Были показаны видимые размеры. А фактический (в байтах) это вот сумма размером всех блоков (в байтах же, опцию -b не применяем), которые этот файл занимает, делённая на 1.

Shell

user@astra:~$ du --block-size=1 1G_
17735680 1G_
Разница между 1073741824 и 17735680 в 60 раз. Порнография какая-то.

На всякий случай размер в килобайтах и в метрах:

Shell

user@astra:~$ du --block-size=1K 1G_
17320 1G_
user@astra:~$ du --block-size=1M 1G_
17 1G_
user@astra:~$
Так у меня 1-гиговый файл стал 17-метровым.

+++++++++++++++++++++++++++++++++++++++++++++

А вот с другим файлом в 1 метр всё нормально:

Shell

user@astra:~$ ls -l 1M_
-rw-r--r-- 1 user user 1048576 янв. 3 17:53 1M_
user@astra:~$
user@astra:~$ du --block-size=1 1M_
1048576 1M_
user@astra:~$ du --block-size=1K 1M_
1024 1M_
user@astra:~$
Прямо душа радуется, безо всяких выкрутасов.

Почему же на файле 1G_ команда du так непредсказуемо себя ведёт? астралинукс, Смоленск 1.5
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16834
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Команда du неправильно подсчитывает размер папки

Сообщение Bizdelnick »

Возвращаемся к недоцитированному Вами куску мана:
although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like
Что это за файл, как он создавался, какая используется файловая система — ничего этого мы не знаем, поэтому на очередной вопрос точного ответа нет.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

Bizdelnick, а что нам поможет тык скыть в решении вопроса?
Что это за файл- файл да и файл. Не символическая ссылка. Не директория. Не канал какой-то там. Не блочное устройство. Не мифическое какое-то там устройство. Обыкновенный файл. regular. Я писал уже.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5039
ОС: Gentoo

Re: Команда du неправильно подсчитывает размер папки

Сообщение /dev/random »

жучара писал(а):
04.01.2020 20:59
а что нам поможет тык скыть в решении вопроса?
Как он создавался и использовался. Вероятнее всего, у вас получился википедия://разрежённый файл.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 523
ОС: астралинукс

Re: Команда du неправильно подсчитывает размер папки

Сообщение жучара »

/dev/random писал:
04.01.2020 21:04
Как он создавался и использовался. Вероятнее всего, у вас получился википедия://разрежённый файл.
Для себя пишу. Как определить, разреженный файл или ты просто в чём-то накосячил? А инод разреженного файла хитрый. Его нужно дампировать и по нему определить, разреженный файл или нет. Это, естессно, везде написано, просто я не нашёл. Итак:

создадим разреженный файл из 10 блоков (частей) по 4096 байт и глянем на его инод. Схема:
1 часть рареженная
2 части неразреженных
3 части разреженных
4 части разреженых

Shell

user@astra:~$
user@astra:~$ dd of=sparse_file bs=4K seek=1 count=0
0+0 записей считано
0+0 записей написано
скопировано 0 байт (0 B), 1,0267e-05 c, 0,0 kB/c
user@astra:~$
user@astra:~$ ls -ls sparse_file
0 -rw-r--r-- 1 user user 4096 янв. 28 21:54 sparse_file
user@astra:~$
user@astra:~$ dd if=/dev/zero of=sparse_file bs=4K seek=1 count=2
2+0 записей считано
2+0 записей написано
скопировано 8192 байта (8,2 kB), 4,449e-05 c, 184 MB/c
user@astra:~$
user@astra:~$ ls -ls sparse_file
8 -rw-r--r-- 1 user user 12288 янв. 28 21:54 sparse_file
user@astra:~$
user@astra:~$ dd of=sparse_file bs=4K seek=6 count=0
0+0 записей считано
0+0 записей написано
скопировано 0 байт (0 B), 9,778e-06 c, 0,0 kB/c
user@astra:~$
user@astra:~$ ls -ls sparse_file
8 -rw-r--r-- 1 user user 24576 янв. 28 21:55 sparse_file
user@astra:~$
user@astra:~$ dd if=/dev/zero of=sparse_file bs=4K seek=6 count=4
4+0 записей считано
4+0 записей написано
скопировано 16384 байта (16 kB), 5,6712e-05 c, 289 MB/c
user@astra:~$
user@astra:~$ ls -ls sparse_file
24 -rw-r--r-- 1 user user 40960 янв. 28 21:55 sparse_file
user@astra:~$
Найдём дамп инода. Описывать не буду, как. Вот он:
0000000 81a4 03e8 a000 0000 6744 5e30 6796 5e30
0000010 6796 5e30 0000 0000 03e8 0001 0030 0000
0000020 0000 0008 0001 0000 f30a 0002 0004 0000
0000030 0000 0000 0001 0000 0002 0000 887c 0050
0000040 0006 0000 0004 0000 8a04 0050 0000 0000
0000050 0000 0000 0000 0000 0000 0000 0000 0000
0000060 0000 0000 780b 2a97 0000 0000 0000 0000
0000070 0000 0000 0000 0000 0000 0000 0000 0000
0000080 0020 0000 15c8 193a 15c8 193a e1e8 4692
0000090 6744 5e30 e1e8 4692 0000 0000 0000 0000
00000a0 0000 0000 0000 0000 0000 0000 0000 0000
*
0000100
Ковыряемся в дампе инода
Определяем, это экстент или нет. Если экстент, работаем дальше. Находим, сколько элементов типа ext4_extent присутстует (у меня два, поле eh_entries структуры ext4_extent_header). И в каждом элементе ext4_extent нас будет интересовать два поля:
First file block number that this extent covers и ee_len

Лазим по дампу, всё это находим и составляем такую табличку (количество строк по количеству элементов типа ext4_extent)

First file block number that this extent covers ee_len
1 2
6 4

Из таблицы видно, как обозначается разреженное пространство в разреженных файлах. До блока 1 пустое (разреженное) пространство размером 1 блок, между блоком 6 и 1 пустое разреженное пространство размером 6-(1+2)=3 блока. Всего 4 разреженных блока, как и заказывали.

Вот так можно определять, разреженный файл. Это всё ищется, естессно, программно. Если файл состоит исключительно из разреженной части, то поле eh_entries структуры ext4_extent_header равно нулю Если не экстент, врать не буду, чё делать не знаю. Если ext4_extent_header.eh_depth > 0, тоже не разбирался. Но направление такое. А вспоминать как создавался 3 года назад файл да как он использовался, это как-то не того.
Я просто читаю маны.
Спасибо сказали: