Я заметил странное поведение с 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
И символическая ссылка не будет разыменована. Я что-то пропустил?
symlink
disk-usage
coreutils
Zagorax
источник
источник
du
хочет играть умно, но если вы запустите,df -a -L bar foo
результат будет очень неправильным (считая 16K в баре, оставляя foo пустым).Ответы:
По умолчанию
du
каждый файл будет учитываться только один раз, если он связан несколько раз. Если вы запуститеdu -L bar
его, он будет считать файл, потому что он достигает его только один раз. Однако, если вы запуститеdu -L *
его, он будет считать только в первый раз. Например:Обратите внимание, что при изменении порядка аргументов папка будет отображаться как 16K.
Вы можете принудительно
du
посчитать файл дважды, передав-l
параметр.Редактировать:
Символьные ссылки - это особый вид файла, и для перехода по ссылке необходим дополнительный шаг.
du
не будет переходить по символическим ссылкам, если-L
опция не включена.С другой стороны, жесткая ссылка - это один файл, существующий в двух (или более) папках.
du
предположительно отслеживает, какие файлы он видел по номеру инода, чтобы избежать их повторного подсчета.-l
отключает это поведениеТак, с just
-L
, он будет следовать по символической ссылке, но если целевой файл имеет номер инода, он уже видел, что он не будет пересчитан. Просто-l
он будет считать дубликаты жестких ссылок, но не будет переходить по символическим ссылкам.Если вы используете
-l
и-L
вместе, он будет следовать по символическим ссылкам, а также позволит подсчитывать целевой файл (ы) более одного раза.источник
-l
делаетcount sizes many times if hard linked
, но здесь я работаю с символической ссылкой. Более того,-l
одиночество не решает проблему, в то время как если я использую оба,-l
и-L
он правильно считает размер.-l
и как-L
взаимодействовать. Объяснение получилось слишком длинным для комментария, поэтому я обновил свой ответ.