почему `du` не показывает результаты для всех файлов?

368
Alexander Bird

Я (ради любопытства) работаю du -aвнутри, /usr/lib/git-coreи он не показывает результаты для всех файлов в этом каталоге. Почему он пропускает произвольный набор файлов?

вот что cd /usr/lib/git-core; du -aвозвращает:

4 ./git-merge-resolve 972 ./git-config 12 ./git-show-index 404 ./git-remote-ftp 4 ./git-difftool 16 ./git-rebase 20 ./git-submodule 40 ./git-issues 12 ./git-filter-branch 36 ./git-add--interactive 4 ./git-web--browse 12 ./git-bisect 8 ./git-relink 412 ./git-fast-import 4 ./git-merge-one-file 248 ./git-instaweb 20 ./git-am 4 ./git-lost-found 4 ./git-notes 384 ./git-daemon 8 ./t_gitshelve.py 376 ./git-http-backend 8 ./git-repack 20 ./gitshelve.py 4 ./git-parse-remote 24 ./git-rebase--interactive 4 ./git-quiltimport 380 ./git-imap-send 8 ./git-pull 4 ./git-sh-setup 4 ./git-difftool--helper 4 ./git-request-pull 372 ./git-shell 4 ./git-merge-octopus 392 ./git-http-fetch 8 ./git-mergetool 380 ./git-upload-pack 12 ./git-mergetool--lib 12 ./git-stash 404 ./git-http-push 5052 . 

но когда я запускаю ls, многие другие файлы отображаются как существующие в текущем каталоге:

git git-add git-add--interactive git-am git-annotate git-apply git-archive git-bisect git-bisect--helper git-blame git-branch git-bundle git-cat-file git-check-attr git-check-ref-format git-checkout git-checkout-index git-cherry git-cherry-pick git-clean git-clone git-commit git-commit-tree git-config git-count-objects git-daemon git-describe git-diff git-diff-files git-diff-index git-diff-tree git-difftool git-difftool--helper git-fast-export git-fast-import git-fetch git-fetch-pack git-filter-branch git-fmt-merge-msg git-for-each-ref git-format-patch git-fsck git-fsck-objects git-gc git-get-tar-commit-id git-grep git-hash-object git-help git-http-backend git-http-fetch git-http-push git-imap-send git-index-pack git-init git-init-db git-instaweb git-issues git-log git-lost-found git-ls-files git-ls-remote git-ls-tree git-mailinfo git-mailsplit git-merge git-merge-base git-merge-file git-merge-index git-merge-octopus git-merge-one-file git-merge-ours git-merge-recursive git-merge-resolve git-merge-subtree git-merge-tree git-mergetool git-mergetool--lib git-mktag git-mktree git-mv git-name-rev git-notes git-pack-objects git-pack-redundant git-pack-refs git-parse-remote git-patch-id git-peek-remote git-prune git-prune-packed git-pull git-push git-quiltimport git-read-tree git-rebase git-rebase--interactive git-receive-pack git-reflog git-relink git-remote git-remote-ftp git-remote-ftps git-remote-http git-remote-https git-repack git-replace git-repo-config git-request-pull git-rerere git-reset git-rev-list git-rev-parse git-revert git-rm git-send-pack git-sh-setup git-shell git-shortlog git-show git-show-branch git-show-index git-show-ref git-stage git-stash git-status git-stripspace git-submodule git-symbolic-ref git-tag git-tar-tree git-unpack-file git-unpack-objects git-update-index git-update-ref git-update-server-info git-upload-archive git-upload-pack git-var git-verify-pack git-verify-tag git-web--browse git-whatchanged git-write-tree gitshelve.py t_gitshelve.py 

Может кто-нибудь объяснить, почему duвозвращается информация только для некоторых файлов? Я не вижу здесь никакой картины.

Запуск file $(du -a) | grep "^\."также не показывает никакой картины.

2
Это происходит и для других каталогов? Как насчет вывода `ls -la`? Bandit 13 лет назад 0
В любой другой папке, которую я пробую где-то в ~, я обнаружил, что `du -a` возвращает данные для каждого файла, который возвращает` ls -aR`. (Я проверил это, выполнив следующую команду в ~: `ls -aR1 | grep -E" ^ [^.] | ^ \. [^.]. * [^:] $ | ^ \.: $ "| Wc -l; du -a | wc -l` Я знаю, что это сложно, но, пожалуйста, поверьте мне, это хороший тест, или покажите, что с ним не так). Alexander Bird 13 лет назад 0
я вижу то же самое на Ubuntu Natty .. в / usr / lib / git-core freethinker 13 лет назад 0
`ls -aR1 | grep -E "^ [^.] | ^ \. [^.]. * [^:] $"> ../tmpls; ду-а | gawk 'match ($ 2, /\.\/(.*)/, ary) '> ../tmpdu; sort ../tmpdu> ../tmpdus; sort ../tmpls> ../tmplss; diff ../tmplss ../tmpdus | grep '^ <' | gawk '' `показывает, какие файлы _не_ захвачены` du -a` (для любого другого, кто может быть одержим поиском ответа типа я = D). Интересно отметить: все файлы, оставленные du, являются файлами ELF. Кроме того, в `/ usr / lib` есть множество файлов, которые` du` решает опустить ... Alexander Bird 13 лет назад 0

1 ответ на вопрос

2
freethinker

If you do a ls -il in the directory.

You willl see that a lot of files have the same inodes. And thats why du -a is showing info for only the unique inodes

АГА!! Я на самом деле уже думал о том, что жесткие ссылки являются проблемой, но, к сожалению для меня, я думал, что `ls -l` покажет синтаксис, похожий на программные ссылки для всех жестких ссылок. Вот почему я пропустил, что они используют один и тот же инод. Ты мой герой прямо сейчас :-) Alexander Bird 13 лет назад 0
Строго говоря, лучшим ответом было бы `ls -AiR1`, (1) чтобы включить файлы«. », (2) потому что ссылки могут быть в разных каталогах, и (3) потому что` -i` работает нормально без ` -l`. Но поздравляю с нахождением основного вопроса. Scott 10 лет назад 0

Похожие вопросы