Если я не пропустил что-то в вашем вопросе, du
уже делает это, когда получает указание следовать символическим ссылкам (-L
).
У меня есть два дерева:
tree1/
├── dir1
│ └── file
├── dirA -> ../tree2/dirA
└── link1 -> dir1
и tree2/
:
.
└── dirA
└── file
В обоих случаях размер файла составляет 1 МБ.
Теперь запустите du -shL
на tree1/
:
$ du -shL tree1
2.0M tree1
Хотя файл можно увидеть три раза в tree1/
при следующих символических ссылках:
$ find tree1 -follow -type f
tree1/dirA/file
tree1/link1/file
tree1/dir1/file
Это только засчитывается дважды к общему количеству. А именно один раз из tree1/
и один раз связанный с tree2/dirA/
(или то, что я понял как вы подразумеваете извне / не являясь подкаталогами tree1/
).
Казалось бы, имеет смысл, потому что, будучи ссылками внутри одного дерева, они на самом деле не занимают дополнительного дискового пространства (кроме записи символической ссылки).
Я также немного увеличил tree1
до:
.
├── dir1
│ └── file
├── dir2
│ └── file -> ../dir1/file
├── dirA -> ../tree2/dirA
└── link1 -> dir1
И побежал:
$ du -abcL .
1048576 ./dir2/file
1048636 ./dir2
1048576 ./dirA/file
1048636 ./dirA
60 ./link1
2097452 .
2097452 total
Как вы можете видеть, ссылки учитываются только до общего размера / размера .
с размером записи (хотя я признаю, что 60
смущает меня, но я бы ожидал 4
), а не (разыменовывается) содержимое файла, на который они указывают.
Это то, что вы хотели или достаточно близко?