Linux программирование в примерах
Часть 106 из 253 Информация о книге
$ <b>du --help</b>Usage: du [OPTION]... [FILE]...Дает сводку использования диска для каждого FILE,рекурсивно для каталогов.Обязательные для длинных опций аргументы являются обязательнымитакже и для коротких опций.-a, --all записать число всех файлов, а не толькокаталогов--apparent-size вывести видимые размеры, а не использованиедиска; хотя видимый размер обычно меньше, онможет быть и больше из-за дыр в файлах,внутренней фрагментации, косвенных блоков и т.п.-В, --block-size=SIZE использовать блоки размером SIZE байтов-b, --bytes эквивалентно '--apparent-size --block-size=1'-с, --total выводит итоговую сумму-D, --dereference-args разыменовывать FILE, которые являютсясимволическими ссылками-h, --human-readable вывести размеры в удобном для восприятияформате (например, 1K 234М 2G)-Н, --si так же, но использовать степени 1000, не 1024-k подобно --block-size=1K-l, --count-links считать размеры несколько раз при прямыхссылках-L, --dereference разыменовывать все символические ссылки-S, --separate-dirs не включать размер подкаталогов-s, --summarize отобразить для каждого аргумента лишь итоги-х, --one-file-system пропускать каталоги на различных файловыхсистемах-X --exclude- исключить файлы, подходящие под любойFILE from=FILE образец в FILE--exclude=PATTERN исключить файлы, соответствующие PATTERN--max-depth=N вывести итог для каталога (или файла, с --all)только если он находится на N или менее уровнейглубже аргумента командной строки;--max-depth=0 то же самое, что и --summarize--help отобразить экран справки и выйти--version вывести сведения о версии и выйтиSIZE может быть (или может быть целым, за которымможет следовать это) одним изследующих: kB 1000, K 1024, MB 1 000 000, M 1 048 576 и т.д.для G, T, Р, E, Z, Y.Чтобы еще больше усложнить дело,
использует частную версиюdu, у которой есть несколько расширений. Сначала имеются дополнительные значения флагов для функции обратного вызова:nftw()FTW_DCHPЭто значение означает, что
не может выполнять 'nftw()'.chdir("..")FTW_DCHЭто значение означает, что
не может использоватьnftw()для перехода в сам каталог.chdir()FTW_DPREЧастная
вызывает для каталогов функцию обратного вызова дважды. Это значение используется при первой встрече с каталогом. После обработки всех нижележащих объектов каталога используется стандартное значениеnftw().FTW_DPЧастная
добавляет также вnftw()новый член,struct FTW. Если текущий объект является каталогом и функция обратного вызова устанавливает в полеint skipненулевое значение,skipне будет больше обрабатывать этот каталог. (Функция обратного вызова должна установитьnftw()таким образом, когдаskipравенflag; делать это дляFTW_DPREслишком поздно.)FTW_DPС этим объяснением за поясом, вот функция
изprocess_file(). Номера строк приведены относительно начала функции:du.c1 /* Эта функция вызывается один раз для каждого объекта файловой2 системы, с которой сталкивается nftw. nftw осуществляет сначала3 поиск вглубь. Эта функция знает это и собирает итоги для каталогов4 на основе изменений в глубине текущего элемента. */56 static int7 process_file(const char *file, const struct stat *sb,8 int file_type, struct FTW *info)9 {10 uintmax_t size;11 uintmax_t size_to_print;12 static int first_call = 1;13 static size_t prev_level;14 static size_t n_alloc;15 static uintmax_t *sum_ent;16 static uintmax_t *sum_subdir;17 int print = 1;1819 /* Всегда определяйте info->skip перед возвратом. */20 info->skip = excluded_filename(exclude, file + info->base);/* Для --exclude */Эта функция делает многое, поскольку ей приходится реализовать все опции
. Строка 17 устанавливаетduв true (1); по умолчанию выводятся сведения о каждом файле. Дальнейший код устанавливает ее при необходимости в false (0).