du błędnie zgłasza pusty katalog

13

Używam tych poleceń:

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

oba raporty:

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

podczas gdy te katalogi zawierają:

$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

Dlaczego duraportowanie 4.0Kdla ./Lightroom_catalog_from_win_backup i jak mogę zmusić go do prawidłowego raportowania?

PS: inne informacje o systemie:

$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
adrhc
źródło
W oparciu o już udzielone odpowiedzi, co /bin/ls -li './*/Lightroom 5 Catalog Linux.lrcat'powraca?
doneal24,
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
Stanowi to problem z odpowiedziami, ponieważ plik z liczbą linków wynoszącą trzy nie jest liczony w innym miejscu dupolecenia. Więc masz tylko dwa podkatalogi w swoim katalogu roboczym?
doneal24,
nie, mam około 15 innych osób
adrhc

Odpowiedzi:

23

Mogę reprodukować, jeśli pliki są twardymi linkami:

~ 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

Jest to oczekiwane zachowanie. Z dokumentów GNUdu :

Jeśli dwa lub więcej twardych linków wskazuje na ten sam plik, liczony jest tylko jeden z twardych linków. Kolejność argumentów w pliku wpływa na to, które łącza są liczone, a zmiana kolejności argumentów może zmienić liczby i wpisy, które wyprowadza.

Jeśli naprawdę potrzebujesz powtarzalnych rozmiarów twardych linków, wypróbuj -lopcję:

-l
--count-links
Policzyć rozmiar wszystkich plików, nawet jeśli pojawiły się już (jako twardy link).

~ du -sh --apparent-size foo bar -l
1.1M    foo
1.1M    bar
muru
źródło
15

Wskazówki jak hrabia link jest 3do dwóch plików Lightroom 5 Catalog Linux.lrcati zbackup.batw Lightroom_catalog_from_win_backup.

Oznacza to, że te dwa pliki są gdzieś połączone (dodatkowe nazwy) z innymi plikami. Po uruchomieniu duw katalogu lub zestawie plików każde twarde łącze jest liczone tylko raz.

Przykład:

$ 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   .

To zachowanie jest wyraźnie wymagane przez standard POSIX dla dunarzędzia :

Plik występujący wiele razy pod jednym operandem pliku, który ma liczbę odsyłaczy większą niż 1, należy policzyć i zapisać tylko dla jednego wpisu.

Niektóre duimplementacje mają niestandardowe opcje wyłączające to zachowanie. W przypadku GNU duodbywa się to z -lopcją.

Kusalananda
źródło
3

Prawie na pewno działa poprawnie. duzlicza każdy plik tylko raz, bez względu na to, ile razy jest przywoływany. Prawdopodobnie twoje dwa katalogi zawierają ten sam zestaw plików połączonych na stałe.

Strona podręcznika dla duofert GNU -l, --count-linksaby wyłączyć tę standardową optymalizację ( man dusprawdź, czy Twoja implementacja ją zawiera). Lub uruchamiasz dudwa razy, raz dla każdego katalogu.

roaima
źródło