Поведінка команди `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

І симпосилання не буде відмежовано. Я щось пропускаю?


Здається, тут 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імовірно відстежує, які файли він бачив за номером inode, щоб уникнути їх підрахунку двічі. -lвідключає таку поведінку.

Так, щойно -L, воно перейде за символічним посиланням, але якщо цільовий файл має номер inode, він вже бачив, він не буде рахуватися повторно. Щойно -lвін буде рахувати дублікати жорстких посилань, але не переходитиме до символічних посилань.

Якщо ви користуєтесь разом -lі -Lразом, вони будуть дотримуватися символічних посилань, а також дозволять рахувати цільові файли більше разів.


Дякую. Це працює. Однак я хотів би отримати додаткове пояснення. На сторінці man я читав, що -lце робить count sizes many times if hard linked, але тут я працюю з symlink. Більше того, -lпоодинці не вирішується проблема, хоча якщо я використовую і те, -lі -Lвоно правильно рахує розмір.
Загоракс

@Zagorax Так, сторінка man трохи не зрозуміла, як -lі як -Lвзаємодіяти. Пояснення було занадто довгим для коментаря, тому я оновив свою відповідь.
Девід Баггерман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.