Zähle rekursiv alle Dateien in einem Verzeichnis [duplizieren]

198

Mögliches Duplikat:
Wie kann ich die Anzahl der Ordner in einem Laufwerk unter Linux zählen?

Ich habe einen wirklich tiefen Verzeichnisbaum auf meiner Linux-Box. Ich möchte alle Dateien in diesem Pfad zählen, einschließlich aller Unterverzeichnisse.

Beispiel für diesen Verzeichnisbaum:

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

Wenn ich weitergebe /home, möchte ich, dass es vier Dateien zurückgibt. Oder Bonuspunkte, wenn vier Dateien und zwei Verzeichnisse zurückgegeben werden. Grundsätzlich möchte ich, dass Sie mit der rechten Maustaste auf einen Ordner unter Windows klicken, Eigenschaften auswählen und sehen, wie viele Dateien / Ordner sich in diesem Ordner befinden.

Wie kann ich das am einfachsten machen? Ich habe eine Lösung für ein Python-Skript, das ich geschrieben habe, aber warum ist das nicht so einfach wie das Ausführen ls | wcoder ähnliches?

omghai2u
quelle
Nicht genau das, wonach Sie suchen, aber um eine sehr schnelle Gesamtsumme zu erhalten, wenn Ihre locateDatenbank auf dem neuesten Stand ist: locate /some/path | wc -l(oder auf meinem Mac:) locate -c /some/path. Aber: Dies zählt auch die Dateien /this/other/path/with/some/pathund die Ordner selbst.
Arjan,
Übrigens ist dies ein anderes, aber eng verwandtes Problem (alle Verzeichnisse auf einem Laufwerk) und eine Lösung: superuser.com/questions/129088/…
Amanda

Antworten:

340

find . -type f | wc -l

Erklärung:
find . -type fFindet alle Dateien ( -type f ) in diesem ( . ) Verzeichnis und in allen Unterverzeichnissen werden die Dateinamen gedruckt, um eine pro Zeile auszugeben.

Dies wird dann verrohrt | into wc(word count) Die -lOption weist wc an, nur die Zeilen seiner Eingabe zu zählen.

Zusammen zählen sie alle Ihre Dateien.

Nifle
quelle
1
Dies hat nichts mit dem Fehler zu tun, der durch den letzten Zeilenumbruch in der findAusgabe verursacht wurde
RobertDeRose
NUR zum Zählen von Verzeichnissen verwenden Sie '-type d' anstelle von '-type f': D
MevlütÖzdemir
1
Wenn keine Dateien gefunden wurden, lautet das Ergebnis1
Dylanthepiguy
47

Die obigen Antworten beantworten bereits die Frage, aber ich werde hinzufügen, dass, wenn Sie find ohne Argumente verwenden (mit Ausnahme des Ordners, in dem die Suche stattfinden soll), wie in:

find . | wc -l

Die Suche geht viel schneller, fast augenblicklich, oder zumindest für mich. Dies liegt daran, dass die type-Klausel einen stat () -Systemaufruf für jeden Namen ausführen muss, um dessen Typ zu überprüfen. Wenn Sie dies nicht tun, wird dies vermieden.

Dies hat den Unterschied, dass die Anzahl der Dateien plus Ordner anstatt nur der Dateien zurückgegeben wird, aber zumindest für mich ist dies ausreichend, da ich diese meistens verwende, um herauszufinden, in welchen Ordnern sich große Mengen an Dateien befinden, deren Kopieren und Komprimieren ewig dauert. Wenn ich Ordner zähle, kann ich immer noch die Ordner mit den meisten Dateien finden. Ich benötige mehr Geschwindigkeit als Präzision.

Francisco Vieira
quelle
1
Wenn keine Dateien gefunden wurden, lautet das Ergebnis1
Dylanthepiguy
25

Für Dateien:

find -type f | wc -l

Für Verzeichnisse:

find -mindepth 1 -type d | wc -l

Beide arbeiten im aktuellen Arbeitsverzeichnis.

cYrus
quelle
1
Wenn keine Dateien gefunden wurden, lautet das Ergebnis1
Dylanthepiguy
8

Mit 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"

Sie müssen find nicht zweimal aufrufen, wenn Sie nach Dateien und Verzeichnissen suchen möchten

user31894
quelle
8

Leichte Aktualisierung auf akzeptierte Antwort, wenn Sie die Anzahl der Verzeichnisse und dergleichen möchten

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Reiche Homolka
quelle
1
Auf einem Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Hier %Tist die Eingabe für eine reguläre Datei leer, ein Stern für eine ausführbare Datei oder ein Schrägstrich für einen Ordner; daher %HTwird ein zusätzlicher Text benötigt, um zu verhindern, dass der Speicherplatz nicht gezählt wird, wie z > %T. )
Arjan
Gibt mir "find: illegal option - e" auf meinem Mac 10.13.6
K.-Michael Aye