Как изменить порядок рекурсии du

Как изменить порядок рекурсии du

Я уже рассматривал сортировку результатов duи видел только такие предложения по sortрезультату, как du | sort.

Это приемлемо для большинства случаев, но это особенно бесполезно при перечислении нескольких каталогов с жесткими ссылками. Например, у меня есть инкрементальный бэкап:

Если duдважды посчитать жесткие ссылки, то содержимое будет выглядеть так

# du -hl --max-depth 1 /backup/saturn/ | sort -k 2
3.2G    /backup/saturn/
456M    /backup/saturn/2017-05-19
458M    /backup/saturn/2017-05-20
461M    /backup/saturn/2017-05-21
464M    /backup/saturn/2017-05-22
462M    /backup/saturn/2017-05-23
462M    /backup/saturn/2017-05-24
465M    /backup/saturn/2017-05-25

Но эти результаты не соответствуют действительности, поскольку каждый устаревший каталог имеет множество жестких ссылок на файлы других каталогов... Это инкрементное резервное копирование.

Но более значимый результат выглядит так.

# du -h --max-depth 1 /backup/saturn/ | sort -k 2
666M    /backup/saturn/
29M     /backup/saturn/2017-05-19
53M     /backup/saturn/2017-05-20
25M     /backup/saturn/2017-05-21
40M     /backup/saturn/2017-05-22
462M    /backup/saturn/2017-05-23
14M     /backup/saturn/2017-05-24
46M     /backup/saturn/2017-05-25

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

Поэтому я ищу способ контролировать порядок duоценки каталогов.

решение1

Расширяя накомментарий риджи, более новые версии duмогут считывать список файлов для сканирования с помощью этой --files0-fromопции, поэтому вы можете сделать следующее:

printf "%s\0" /backup/saturn/*/ | sort -z | du --files0-from=- -h --total

Например:

$ du -hxd1 foo
111M    foo/2017-05-20
4.0K    foo/2017-05-19
4.0K    foo/2017-05-30
111M    foo

И:

$ printf "%s\0" foo/*/ | sort -z | du --files0-from=- -h --total
101M    foo/2017-05-19/
11M     foo/2017-05-20/
4.0K    foo/2017-05-30/
111M    total

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

$ find foo -mindepth 1 -maxdepth 1 -type d -print0 | sort -z | du --files0-from=- -h --total
101M    foo/2017-05-19
11M     foo/2017-05-20
4.0K    foo/2017-05-30
111M    total

Связанный контент