du错误地报告了空目录


13

我正在使用以下命令:

du -sh --apparent-size ./*
du -sh ./*

两者都报告:

4.0K    ./Lightroom_catalog_from_win_backup
432M    ./Lightroom catalog - wine_backup

而这些目录包含:

$ll ./"Lightroom catalog - wine_backup"
total 432M
-rwxrwx--- 1 gigi gigi 432M Mar 18  2018 Lightroom 5 Catalog Linux.lrcat
-rwxrwx--- 1 gigi gigi  227 Nov 21  2015 zbackup.bat
$ll ./Lightroom_catalog_from_win_backup
total 396M
-rwxrwx--- 3 gigi gigi 396M Dec 17 09:35 Lightroom 5 Catalog Linux.lrcat
-rwxrwx--- 3 gigi gigi  227 Dec 17 09:35 zbackup.bat

为什么du要报告4.0K./Lightroom_catalog_from_win_backup,我如何才能使其正确报告?

PS:其他系统信息:

$stat --file-system $HOME
  File: "/home/gigi"
    ID: 5b052c62a5a527bb Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 720651086  Free: 155672577  Available: 119098665
Inodes: Total: 183050240  Free: 178896289

$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:        16.04
Codename:       xenial

以到目前为止已经给出的答案为基础,/bin/ls -li './*/Lightroom 5 Catalog Linux.lrcat'返回的结果是什么?
doneal24 '18

ls -li ./*/"Lightroom 5 Catalog Linux.lrcat" 36831321 -rwxrwx--- 1 gigi gigi 432M Mar 18 2018 ./Lightroom catalog - wine_backup/Lightroom 5 Catalog Linux.lrcat 36833201 -rwxrwx--- 3 gigi gigi 396M Dec 17 09:35 ./Lightroom_catalog_from_win_backup/Lightroom 5 Catalog Linux.lrcat
adrhc

1
由于链接计数为3的文件未在du命令中的其他位置进行计数,因此这给答案带来了问题。因此,您的工作目录中只有两个子目录?
doneal24 '18

不,我还有其他15个人
adrhc

Answers:


23

如果文件是硬链接,我可以重现:

~ mkdir foo bar
~ dd if=/dev/urandom of=bar/file1 count=1k bs=1k
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00985276 s, 106 MB/s
~ ln bar/file1 foo/file1
~ du -sh --apparent-size foo bar
1.1M    foo
4.0K    bar

这是预期的行为。从GNU du文档

如果两个或多个硬链接指向同一文件,则仅计算一个硬链接。文件参数顺序影响计数的链接,更改参数顺序可能会更改du输出的数字和条目。

如果您确实需要重复大小的硬链接,请尝试以下-l选项:

' -l'
' --count-links'
计算所有文件的大小,即使它们已经出现(作为硬链接)。

~ du -sh --apparent-size foo bar -l
1.1M    foo
1.1M    bar

15

请注意和中3两个文件的链接计数。Lightroom 5 Catalog Linux.lrcatzbackup.batLightroom_catalog_from_win_backup

这意味着这两个文件被硬链接到其他文件(其他名称)。当您du在一个目录或一组文件上运行时,每个硬链接仅计算一次。

例:

$ ls -l
total 41024
-rw-r--r--  2 kk  wheel  10485760 Dec 17 09:07 file1
-rw-r--r--  2 kk  wheel  10485760 Dec 17 09:07 file2

$ du -h file1
10.0M   file1

$ du -h file2
10.0M   file2

$ du -h .
10.0M   .

POSIX标准对该du实用工具明确规定了此行为:

在一个文件操作数下多次出现且链接计数大于1的文件应仅对一个条目进行计数和写入。

某些du实现具有非标准选项来禁用此行为。对于GNU du,这是通过-l选项完成的。


3

几乎可以肯定它工作正常。 du不管引用多少次,每个文件仅计数一次。您的两个目录可能包含相同的硬链接文件集。

GNU的手册页du提供-l--count-links以关闭此标准优化(请参阅man du检查您的实现中是否包括此优化)。或者,您运行du两次,每个目录一次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.