Поведение команды `du` с флагом` -L`

11

Я заметил странное поведение с duкомандой, когда она используется с параметром -Lкомандной строки.

Я использую Slackware 14 и Coreutils 8.19.

Чтобы воспроизвести странное поведение, создайте две папки:

mkdir foo
mkdir bar

Создайте файл внутри одной из папок:

perl -e 'print "A"x10000' > foo/text

И символическая ссылка в другой папке:

ln -s ../foo/text bar/text

Теперь, если вы введете:

du -h -L bar

Ты получишь:

16k bar

Поскольку ссылка была разыменована. Но если вы введете:

du -h -L *

Ты получишь:

16K     foo
4.0K    bar

И символическая ссылка не будет разыменована. Я что-то пропустил?

Zagorax
источник
кажется, он duхочет играть умно, но если вы запустите, df -a -L bar fooрезультат будет очень неправильным (считая 16K в баре, оставляя foo пустым).
Гвидо

Ответы:

18

По умолчанию duкаждый файл будет учитываться только один раз, если он связан несколько раз. Если вы запустите du -L barего, он будет считать файл, потому что он достигает его только один раз. Однако, если вы запустите du -L *его, он будет считать только в первый раз. Например:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

Обратите внимание, что при изменении порядка аргументов папка будет отображаться как 16K.

Вы можете принудительно duпосчитать файл дважды, передав -lпараметр.

Редактировать:

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

С другой стороны, жесткая ссылка - это один файл, существующий в двух (или более) папках. duпредположительно отслеживает, какие файлы он видел по номеру инода, чтобы избежать их повторного подсчета. -lотключает это поведение

Так, с just -L, он будет следовать по символической ссылке, но если целевой файл имеет номер инода, он уже видел, что он не будет пересчитан. Просто -lон будет считать дубликаты жестких ссылок, но не будет переходить по символическим ссылкам.

Если вы используете -lи -Lвместе, он будет следовать по символическим ссылкам, а также позволит подсчитывать целевой файл (ы) более одного раза.

Дэвид Баггерман
источник
Спасибо. Это работает. Однако я хотел бы получить дополнительное объяснение. На man-странице я прочитал, что -lделает count sizes many times if hard linked, но здесь я работаю с символической ссылкой. Более того, -lодиночество не решает проблему, в то время как если я использую оба, -lи -Lон правильно считает размер.
Загоракс
@Zagorax Да, на странице руководства немного неясно, как -lи как -Lвзаимодействовать. Объяснение получилось слишком длинным для комментария, поэтому я обновил свой ответ.
Дэвид Баггерман,