Почему "find . -Print0 | xargs -r0 du -chx" и "du -chx" разные результаты?
Когда я пытаюсь получить общий размер размещенных файлов с поиском. -принт0 | xargs -r0 du -chx это возвращение: всего 61G. Когда я использую standalone du -chx, это дает мне: 2.8T всего
% df -h дает тот же результат: Используемый размер файловой системы Доступно Использовать% Установлено в /dev/md7 3.6T 2.8T 599G 83% /opt
Где ошибка?
3 ответа
61G - сумма последнего элемента.
Если вы прокрутите назад или используете grep, вы увидите больше итогов.
find . -print0 | xargs -r0 du -chx|grep total
Вы запрашиваете 'du -chx' для каждого последующего dir и subdir вместо всех вместе.
Итоговое значение 61G, которое вы видите из команды 'find', - это просто общее количество из последней "группы" аргументов, которые видел xargs. (xargs может принимать только ограниченное количество аргументов, поэтому "общее", которое вы видите, не является "общим итогом".)
Попробуй это:
find pjproject-2.1.0/ -print0 | xargs -r0 du -chx | grep "total"
Предполагая, что нет файлов с именем "total", вы увидите список итогов, который будет более или менее совпадать с выводом команды du.
Одна ошибка заключается в том, что find|du собирается суммировать повторяющиеся результаты, например, с помощью структуры каталогов foo/bar/baz он будет эффективно выполнять 'du -chx foo foo/bar foo/bar/baz'. Это подсчет foo/bar/baz dir 3 раза. Тем не менее, это будет неправильно подсчитывать на высокой стороне, поэтому не объясняет, что вы видите.
Второй вопрос - количество аргументов, которые вы передаете дю. В случае поиска у вас будет тысячи аргументов, и xargs будет обрабатывать их порциями. Вы на самом деле видите не все файлы, а промежуточный итог для их части. По пути было напечатано несколько других промежуточных итогов. Прочитайте справочную страницу для xargs, в частности -n (max args) и -s (максимальная длина командной строки)
Обычная вещь, которую нужно сделать здесь, это не полагаться на суммы для одного вызова 'du', а делать суммы в другой команде в вашем конвейере. Однако, как только вы попробуете это, вы столкнетесь с первой проблемой, о которой я упомянул, - вы будете считать каталоги несколько раз.