Jak policzyć całkowitą liczbę plików / folderów w systemie?

7

Jak mogę policzyć liczbę wszystkich plików / folderów, które istnieją w systemie, używając wiersza polecenia?

Mogę go znaleźć za pomocą GUI, po prostu otwierając okno właściwości dla całego folderu / , ale dobrze byłoby wiedzieć, jak to zrobić za pomocą wiersza poleceń.

Czy potrzebowałbym całej serii poleceń, czy tylko jedna będzie możliwa?

    
zadawane DevRobot 19.12.2015, 18:32
źródło

6 odpowiedzi

11

Ponieważ nazwy plików / folderów mogą zawierać znaki nowej linii:

sudo find / -type f -printf '.' | wc -c
sudo find / -type d -printf '.' | wc -c

To policzy dowolny plik / folder w bieżącym katalogu / . Ale jak wskazuje muru, możesz chcieć wykluczyć wirtualne / inne systemy plików z licznika (poniższe wykluczy dowolny inny zamontowany system plików):

find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
  • sudo find / -type f -printf '.' : drukuje kropkę dla każdego pliku w / ;
  • sudo find / -type d -printf '.' : drukuje kropkę dla każdego folderu w / ;
  • wc -c : zlicza liczbę znaków.

Oto przykład, jak nie dbanie o nowe linie w nazwach plików / folderów może łamać inne metody, takie jak np. find / -type f | wc -l i sposób, w jaki użycie find / -type f -printf '.' | wc -c faktycznie to poprawia:

% ls
% touch "file
\'dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1

Jeśli STDOUT nie jest terminalem, find będzie dosłownie drukować każdą nazwę pliku / folderu; oznacza to, że nazwa pliku / folderu zawierająca znak nowej linii zostanie wydrukowana w dwóch różnych wierszach, a ten wc -l zlicza dwie linie dla pojedynczego pliku / folderu, ostatecznie drukując wynik przez jeden.

    
odpowiedział kos 19.12.2015, 18:37
źródło
7

1 metoda byłaby

sudo find / -type f | wc -l
sudo find / -type d | wc -l

(sudo, aby uniemożliwić dostęp do błędów)

f dla plików, d dla katalogów.

System plików / proc / będzie błędny, ale nie uważam tych plików;)

    
odpowiedział Rinzwind 19.12.2015, 18:34
źródło
5

Jeśli naprawdę chcesz całkowita liczba obiektów w systemie plików, użyj df -i do zliczenia i-węzłów. Nie dostaniesz podziału między katalogami i zwykłymi plikami, ale na plusie działa prawie natychmiast. Całkowita liczba używanych i-ów to coś, co systemy plików już śledzą.

Jeśli chcesz użyć jednej z sugestii find , nie uruchamiaj jej tylko na / . Użyj find -xdev na liście punktów montowania generowanych przez coś takiego jak findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET lub coś podobnego. Nie wyklucza to jednak montowania bindów, więc pliki pod bindami zostaną policzone dwukrotnie. findmnt jest całkiem niezły.

Z pewnością istnieje prosty sposób na wypisanie wszystkich swoich "dysków" bez konieczności podawania jawnego typu systemu plików, ale nie jestem do końca pewien.

Jak sugeruje inna odpowiedź, użyj find -printf . | wc -c , aby uniknąć możliwych problemów z liczeniem zabawnych znaków w nazwach plików. Użyj -not -type d do policzenia plików nie będących katalogami. (Nie chcesz wykluczyć dowiązań symbolicznych, prawda?)

    
odpowiedział Peter Cordes 20.12.2015, 08:51
źródło
4
sudo find / -type f | wc -l

powie Ci liczbę zwykłych plików w twoim systemie i

sudo find / -type d | wc -l

liczba folderów.

    
odpowiedział Florian Diesch 19.12.2015, 18:36
źródło
2

Używanie zsh :

Jako root dla zwykłych plików:

files=( /**/*(.D) )

to zajmie wszystkie zwykłe pliki, w tym te zaczynające się od . do tablicy files , teraz możemy po prostu policzyć liczbę elementów tablicy:

echo $#files

to będzie obsługiwać wszystkie przypadki krańcowe, np. nietypowe nazwy plików.

Podobnie dla katalogów:

dirs=( /**/*(/D) )
echo $#dirs
    
odpowiedział heemayl 20.12.2015, 03:29
źródło
2

Inne podejście, które wykorzystuje locatedb :

locate / | wc -l

Zalety:

  • Nie wymaga sudo
  • Znacznie szybciej niż podejścia oparte na find (już wstępnie zindeksowane)
  • Już stosuje się -xdev : tzn. pomija specjalne pliki: /dev , /proc itd.

Downsides:

  • Brak dokładności 100%: zawiera katalogi, pomija pliki w /tmp , może dwukrotnie lub więcej zliczać pliki z nowymi liniami w nazwie, na przykład
  • Wolniejsze niż podejście df -i
  • Odzwierciedla rzeczywistość "ostatniej ~ 24 godziny migawki" zamiast dokładnego bieżącego stanu
odpowiedział arielf 26.12.2015, 11:21
źródło

Przeczytaj inne pytania na temat tagów