Почему "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', а делать суммы в другой команде в вашем конвейере. Однако, как только вы попробуете это, вы столкнетесь с первой проблемой, о которой я упомянул, - вы будете считать каталоги несколько раз.

Другие вопросы по тегам