Rekurencyjnie policz wszystkie pliki w katalogu [duplikat]

198

Możliwa duplikat:
Jak policzyć liczbę folderów na dysku w systemie Linux?

Mam naprawdę głębokie drzewo katalogów na moim Linux-ie. Chciałbym policzyć wszystkie pliki w tej ścieżce, w tym wszystkie podkatalogi.

Na przykład, biorąc pod uwagę to drzewo katalogów:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Jeśli przejdę /home, chciałbym, aby zwrócił cztery pliki. Lub punkty bonusowe, jeśli zwróci cztery pliki i dwa katalogi. Zasadniczo chcę odpowiednik kliknięcia folderu prawym przyciskiem myszy w systemie Windows i wybrania właściwości i sprawdzenia, ile plików / folderów znajduje się w tym folderze.

Jak najłatwiej to zrobić? Mam rozwiązanie obejmujące napisany skrypt w języku Python, ale dlaczego nie jest to tak proste, jak uruchomienie ls | wclub podobne?

omghai2u
źródło
Nie jest to dokładnie to, czego szukasz, ale aby uzyskać bardzo szybki ogólnej sumy, jeśli twoja locatebaza danych jest na bieżąco: locate /some/path | wc -l(lub na komputerze Mac: locate -c /some/path). Ale: spowoduje to również policzenie plików /this/other/path/with/some/pathi same foldery.
Arjan
Nawiasem mówiąc, jest to inny, ale ściśle powiązany problem (zliczanie wszystkich katalogów na dysku) i rozwiązanie: superuser.com/questions/129088/…
Amanda

Odpowiedzi:

340

find . -type f | wc -l

Objaśnienie:
find . -type fodnajduje wszystkie pliki ( -type f ) w tym katalogu ( . ) I we wszystkich podkatalogach, nazwy plików są następnie drukowane w standardzie po jednym w wierszu.

To jest następnie rurami | w wc(liczba słów) -lopcja mówi wc, aby zliczała tylko wiersze swojego wejścia.

Razem liczą wszystkie twoje pliki.

Nifle
źródło
1
To nie dotyczy błędu off-by-one z powodu ostatniej nowej linii z findwyjścia
RobertDeRose
TYLKO do zliczania katalogów użyj „-type d” zamiast „-type f”: D
MevlütÖzdemir
1
Jeśli nie znaleziono plików, wynikiem jest1
Dylanthepiguy
47

Powyższe odpowiedzi już odpowiadają na pytanie, ale dodam, że jeśli użyjesz funkcji znajdź bez argumentów (z wyjątkiem folderu, w którym chcesz przeprowadzić wyszukiwanie), jak w:

find . | wc -l

wyszukiwanie przebiega znacznie szybciej, prawie natychmiast, a przynajmniej dla mnie. Wynika to z faktu, że klauzula typu musi uruchamiać wywołanie systemowe stat () dla każdej nazwy, aby sprawdzić jej typ - pominięcie jej pozwala temu zapobiec.

Różnica polega na zwróceniu liczby plików plus folderów zamiast samych plików, ale przynajmniej dla mnie to wystarczy, ponieważ najczęściej używam tego, aby znaleźć, które foldery mają ogromną liczbę plików, które trwają wiecznie, aby je skopiować i skompresować. Liczenie folderów wciąż pozwala mi znaleźć foldery z większością plików, potrzebuję więcej prędkości niż precyzji.

Francisco Vieira
źródło
1
Jeśli nie znaleziono plików, wynikiem jest1
Dylanthepiguy
25

Dla plików:

find -type f | wc -l

W przypadku katalogów:

find -mindepth 1 -type d | wc -l

Oba działają w bieżącym katalogu roboczym.

Cyrus
źródło
1
Jeśli nie znaleziono plików, wynikiem jest1
Dylanthepiguy
8

Z bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Nie musisz dzwonić dwukrotnie, jeśli chcesz wyszukać pliki i katalogi

użytkownik31894
źródło
8

Nieznaczna aktualizacja przyjętej odpowiedzi, jeśli chcesz liczbę reż

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Rich Homolka
źródło
1
Na Macu / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Tutaj typ %Tjest pusty dla zwykłego pliku, gwiazdka dla pliku wykonywalnego lub ukośnik dla folderu; dlatego %HTjest potrzebny lub dodatkowy tekst, aby uniknąć policzenia miejsca, jak > %T. )
Arjan,
Daje mi „znajdź: nielegalna opcja - e” na moim 10.13.6 Mac
K.-Michael Aye