2010-10-12 21:41:12 +0000 2010-10-12 21:41:12 +0000
217
217

Powtórne zliczanie wszystkich plików w katalogu

Possible Duplicate: Jak mogę zliczyć ilość folderów w napędzie z Linuksem?

Mam naprawdę głębokie drzewo katalogów na moim Linuxie. Chciałbym zliczyć wszystkie pliki w tej ścieżce, włączając w to 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 podam /home, chciałbym aby zwróciło cztery pliki. Lub, bonusowe punkty, jeśli zwróci cztery pliki i dwa katalogi. Zasadniczo, chcę odpowiednik kliknięcia prawym przyciskiem myszy na dany folder w systemie Windows i wybrania właściwości oraz zobaczenia, ile plików/katalogów znajduje się w tym folderze.

Jak najłatwiej to zrobić? Mam rozwiązanie obejmujące skrypt Pythona, który napisałem, ale dlaczego nie jest to tak proste jak uruchomienie ls | wc lub podobnego?

Odpowiedzi (5)

364
364
364
2010-10-12 21:44:53 +0000

find . -type f | wc -l

Wyjaśnienie: find . -type f znajduje wszystkie pliki ( -type f ) w tym ( . ) katalogu i we wszystkich podkatalogach, nazwy plików są następnie wypisywane standardowo po jednym w wierszu.

Jest to następnie wypisywane | do wc (zliczanie słów) opcja -l mówi wc, aby liczył tylko wiersze swojego wejścia.

Razem liczą wszystkie pliki.

49
49
49
2011-03-28 22:00:38 +0000

Powyższe odpowiedzi już odpowiadają na pytanie, ale dodam, że jeśli używasz wyszukiwania bez argumentów (z wyjątkiem folderu, w którym chcesz, aby wyszukiwanie miało miejsce) jak w:

find . | wc -l

wyszukiwanie przebiega znacznie szybciej, prawie natychmiastowo, a przynajmniej dla mnie tak. Dzieje się tak dlatego, że klauzula type musi uruchomić system stat() wywołujący każdą nazwę, aby sprawdzić jej typ - pomijając ją unika się tego.

Różnica polega na tym, że zamiast tylko plików zwracana jest liczba plików plus folderów, ale przynajmniej dla mnie to wystarczy, ponieważ najczęściej używam tego, które foldery mają ogromne ilości plików, których skopiowanie i skompresowanie zajmuje wieki. Liczenie folderów wciąż pozwala mi znaleźć foldery z większością plików, potrzebuję więcej prędkości niż precyzji.

26
26
26
2010-10-12 21:56:03 +0000

Dla plików:

find -type f | wc -l

Dla katalogów:

find -mindepth 1 -type d | wc -l

Oba pracują w aktualnym katalogu roboczym.

8
8
8
2010-10-13 01:58:12 +0000

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 trzeba dzwonić dwa razy, aby znaleźć pliki i katalogi

8
8
8
2010-10-13 14:26:17 +0000

Niewielka aktualizacja do zaakceptowanej odpowiedzi, jeśli chcesz liczbę dirsów i takie

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn