Sie verwechseln den unterbrochenen Balken ¦(ASCII 166) mit dem vertikalen Balken |(ASCII 124), der für die UNIX-Pipeline verwendet wird .
Skippy le Grand Gourou
7
@ SkippyleGrandGourou Heißt es nicht eine Pfeife?
DaveStephens
27
@ DaveStephens Ja, das nennt man auch so. Es wird auch als Sheffer-Strich, Verti-Bar, Vbar, Stick, vertikale Linie, vertikaler Schrägstrich, Bar, Obelisk, Glidus bezeichnet.
Emlai
64
@zenith Ich nenne es einfach Bob.
Christopher
15
In RFC20 heißt es "vertikale Linie". "Pipe" ist der Name des Shell-Operators und nicht der Name des Symbols. Genau wie *das ASCII-Zeichen "Stern", aber "Zeiten" in einigen anderen Kontexten.
schlank
Antworten:
1327
Das sollte funktionieren:
find DIR_NAME -type f | wc -l
Erläuterung:
-type f nur Dateien einschließen.
|( und nicht¦ ) leitet finddie Standardausgabe des wcBefehls zur Standardeingabe des Befehls um.
wc(Abkürzung für Word Count) zählt Zeilenumbrüche, Wörter und Bytes in seiner Eingabe ( docs ).
-l nur Zeilenumbrüche zählen.
Anmerkungen:
Ersetzen DIR_NAMEdurch ., um den Befehl im aktuellen Ordner auszuführen.
Sie können auch die -type fVerzeichnisse (und Symlinks) entfernen , um sie in die Zählung aufzunehmen.
Es ist möglich, dass dieser Befehl überzählt, wenn Dateinamen Zeilenumbrüche enthalten können.
Erklärung, warum Ihr Beispiel nicht funktioniert:
In dem Befehl, den Sie angezeigt haben, verwenden Sie nicht die "Pipe" ( |), um zwei Befehle zu verbinden, sondern die unterbrochene Leiste ( ¦), die die Shell nicht als Befehl oder ähnliches erkennt. Deshalb erhalten Sie diese Fehlermeldung.
Das fIn -type fsteht für Dateien und wc -lfür Wortzählzeilen.
Serge Stroobandt
3
Entfernen Sie die -type fVerzeichnisse, um sie in die Zählung aufzunehmen
phatblat
3
Es gibt keine Notwendigkeit für die -printFlagge
Zoltán
3
Wenn die Möglichkeit besteht, dass Dateinamen das Zeilenumbruchzeichen enthalten, möchten Sie möglicherweise das -print0Flag verwenden.
Gaboroncancio
2
@gaboroncancio Das wird nicht helfen, es sei denn, eine Implementierung von wchat die Option, eine nullterminierte Liste zu lesen. Siehe meine Antwort für eine Alternative.
Diese Lösung berücksichtigt keine Dateinamen, die Zeilenumbrüche enthalten.
Kusalananda
2
Für das aktuelle Verzeichnis benötigen Sie nicht einmal die.
Taufe
1
Eigentlich auf einigen Plattformen, Sie tun müssen , um buchstabierenfind .
tripleee
1
@Kusalanandra Ihr Kommentar gilt für fast jede Antwort hier.
Tripleee
69
Wenn Sie eine Aufschlüsselung der Anzahl der Dateien in jedem Verzeichnis unter Ihrem aktuellen Verzeichnis wünschen:
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
Das kann natürlich alles in einer Zeile gehen. Die Klammern verdeutlichen, wessen Ausgabe wc -l( find $i -type fin diesem Fall) überwacht werden soll .
Die Verwendung findfür die äußere Schleife ist nur eine unnötige Komplikation. for i in */;; do`
Tripleee
Funktion countit {für i in $ (find. -maxdepth 1 -type d); do file_count = $ (finde $ i-Typ f | wc -l); echo "$ file_count: $ i"; erledigt }; countit | sort -n -r
Schneems
Endlich ist es das, was ich brauchte. Meine Ordner haben Tausende von Dateien, so dass das Drucken mit Baum oder irgendetwas anderem keine Option ist
lesolorzanov
Dies schließt ../ ein und scheint nicht vorwärts zu gehen - was bedeutet, dass es nicht regressiv ist.
Daniel Lefebvre
50
Sie können verwenden
$ tree
nach der Installation des Tree- Pakets mit
$ sudo apt-get install tree
(auf einem Debian / Mint / Ubuntu Linux-Computer).
Der Befehl zeigt nicht nur die Anzahl der Dateien, sondern auch die Anzahl der Verzeichnisse separat an. Mit der Option -L kann die maximale Anzeigeebene angegeben werden (die standardmäßig die maximale Tiefe des Verzeichnisbaums ist).
Mit der -aOption können auch ausgeblendete Dateien eingefügt werden.
Dies ist der einfachste Weg, um die Anzahl der Verzeichnisse und Dateien anzuzeigen.
Lorem Ipsum Dolor
11
Über die Manpage: Standardmäßig druckt der Baum keine versteckten Dateien . Sie müssen die -aOption angeben, um sie einzuschließen.
eee
3
Um dies unter macOS zu installieren, verwenden Sie es brewund führen Sie es aus brew install tree, vorzugsweise nach dem Ausführen brew update.
Ashish Ahuja
4
Es werden auch alle Dateinamen gedruckt, sodass es langsam ist, wenn Sie viele Dateien haben.
Franck Dernoncourt
2
Wow, sehr schönes Tool, es kann Ordner farbig drucken, nur Ordner auflisten, als JSON ausgeben. In wenigen Sekunden können 34.000 Ordner und 51.000 Dateien aufgelistet werden. Olé!
Brasofilo
46
Auf meinem Computer rsyncist ein bisschen schneller als find | wc -lin der akzeptierten Antwort:
$ rsync --stats --dry-run -ax /path/to/dir /tmp
Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes
Die zweite Zeile enthält die Anzahl der Dateien, im obigen Beispiel 150.481. Als Bonus erhalten Sie auch die Gesamtgröße (in Bytes).
Bemerkungen:
Die erste Zeile enthält eine Anzahl von Dateien, Verzeichnissen, Symlinks usw. zusammen. Deshalb ist sie größer als die zweite Zeile.
die --dry-run(oder-n kurz gesagt) Option ist wichtig, um die Dateien nicht tatsächlich zu übertragen!
Ich habe die -xOption verwendet, um "Dateisystemgrenzen nicht zu überschreiten". Wenn Sie sie ausführen /und externe Festplatten angeschlossen haben, werden nur die Dateien auf der Root-Partition gezählt.
Ich mag Ihre Idee, hier rsync zu verwenden. Ich hätte nie darüber nachgedacht!
Qeole
Danke @Qeole, die Idee ist aber nicht meine. Ich habe es vor einigen Jahren irgendwo gelesen, dass rsync am schnellsten einen Ordner mit vielen Dateien und Unterordnern löscht, daher dachte ich, es könnte schnell gehen, auch Dateien zu zählen.
Schmied
1
Versuchte dies. Nachdem beide zuvor zweimal ausgeführt wurden, um den fs-Cache zu füllen, find ~ -type f | wc -ldauerte es 1,7 / 0,5 / 1,33 Sekunden (real / user / sys). rsync --stats --dry-run -ax ~ /xxxdauerte 4,4 / 3,1 / 2,1 Sekunden. Das sind ungefähr 500.000 Dateien auf SSD.
schlank
Keine Ahnung, welche Version von rsync Sie verwendet haben, aber in 3.1.2 ist es etwas einfacher zu lesen:Number of files: 487 (reg: 295, dir: 192)
mpen
Ich habe die Standardeinstellung rsync unter macOS verwendet:rsync version 2.6.9 protocol version 29
psmith
20
Da Dateinamen in UNIX möglicherweise Zeilenumbrüche enthalten (ja, Zeilenumbrüche), werden wc -lmöglicherweise zu viele Dateien gezählt. Ich würde für jede Datei einen Punkt drucken und dann die Punkte zählen:
Sieht so aus, als wäre dies die einzige Lösung, die Dateien mit Zeilenumbrüchen im Namen verarbeitet. Upvoted.
Codeforester
2
hihi :) Ich liebe Zeilenumbrüche in Dateinamen. Das macht sie nur lesbarer.
hek2mgl
Ich meine, neue Zeilen in den Dateinamen nicht der Inhalt!
Codeforester
1
Ich habe nur Spaß gemacht ... Ja, Zeilenumbrüche in Dateinamen müssen immer berücksichtigt werden. Sie könnten von böswilligen oder weniger spektakulären Inhalten stammen, von Tippfehlern.
hek2mgl
18
Wenn Sie einige der Antworten hier zusammenfassen, scheint die nützlichste Lösung zu sein:
Es kann seltsame Dinge wie Dateinamen verarbeiten, die Leerzeichen in Klammern und sogar neue Zeilen enthalten. Außerdem wird die Ausgabe nach der Anzahl der Dateien sortiert.
Sie können die Anzahl nach erhöhen -maxdepth, um auch Unterverzeichnisse zu zählen. Beachten Sie, dass dies möglicherweise lange dauern kann, insbesondere wenn Sie eine stark verschachtelte Verzeichnisstruktur in Kombination mit einer hohen -maxdepthAnzahl haben.
Was ist mit dem echo -e? Ich denke, Sie setzen es ein, um alle Zeilenumbrüche zu falten, aber es wird auch jedes andere unregelmäßige Leerzeichen entstellen und versuchen, alle in den Dateinamen wörtlich vorhandenen Platzhalterzeichen zu erweitern. Ich würde einfach mit so etwas anfangen find .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'und mit Aberrationen in der Ausgabe leben oder vielleicht mit Bashs spielen, printf "%q"um den Verzeichnisnamen zu drucken.
Tripleee
10
Wenn Sie wissen möchten, wie viele Dateien und Unterverzeichnisse aus dem aktuellen Arbeitsverzeichnis vorhanden sind, können Sie diesen Einzeiler verwenden
Hervorragende Lösung! Das einzige Problem, das ich fand, waren Verzeichnisse mit Leerzeichen oder Sonderzeichen. Fügen Sie Anführungszeichen hinzu, in denen der Verzeichnisname verwendet wird:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
John Kary
1
Ich habe es ein wenig modifiziert und es funktioniert ganz gut für mich:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek
Meine Kommentare zu @ Sebastians Antwort gelten auch hier. Die Verwendung echo -e(oder nur "Echo" wie im vorhergehenden Kommentar) eines nicht zitierten Verzeichnisnamens tauscht ein Problem gegen ein anderes aus.
Tripleee
8
Wenn Sie Fehlerfälle vermeiden möchten, lassen Sie dies nicht zu wc -l Fehlerfälle Dateien mit Zeilenumbrüchen anzeigen (die als 2+ Dateien gelten).
Beispiel: Stellen Sie sich einen Fall vor, in dem eine einzelne Datei mit einem einzelnen EOL-Zeichen enthalten ist
> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2
Da gnu zumindest wckeine Option zum Lesen / Zählen einer nullterminierten Liste (außer aus einer Datei) zu haben scheint, besteht die einfachste Lösung darin, die Dateinamen nicht zu übergeben, sondern jedes Mal eine statische Ausgabe, wenn eine Datei gefunden wird, z im selben Verzeichnis wie oben
Sie können den Befehl verwenden ncdu. Es wird rekursiv gezählt, wie viele Dateien ein Linux-Verzeichnis enthält. Hier ist ein Beispiel für die Ausgabe:
Es hat einen Fortschrittsbalken, der praktisch ist, wenn Sie viele Dateien haben:
Das berechnet hauptsächlich die Festplattennutzung, nicht die Anzahl der Dateien. Dieser zusätzliche Aufwand ist wahrscheinlich nicht erwünscht. (Abgesehen von der Notwendigkeit, ein zusätzliches Paket für etwas zu installieren, das mit Standard-POSIX-Dienstprogrammen ausgeführt werden kann)
hek2mgl
@ hek2mgl Berechnet die Anzahl der Dateien, wie im ersten Screenshot rot dargestellt. Ich habe ein paar Minuten für ~ 2 Millionen Dateien gebraucht, daher ist die Geschwindigkeit nicht schlecht.
Franck Dernoncourt
2
@ hek2mgl Ich habe der Antwort einen reproduzierbaren Benchmark hinzugefügt, ihn zweimal ausgeführt und keinen Unterschied zwischen find . -type f | wc -lund festgestellt ncdu.
Franck Dernoncourt
2
Ja, es sieht so aus, als ob findunter der Haube mehr oder weniger dieselben Systemaufrufe ausgeführt werden, für dudie das Backend bestimmt ist ncdu. Einfach gespannt.
hek2mgl
1
@FranckDernoncourt hat es geliebt. Ich habe eine Menge Dateien in einem Ordner und eine Fortschrittsanzeige ist lebensrettend. Danke für das Teilen!
Geben Sie ein, um festzustellen, wie viele Dateien sich im aktuellen Verzeichnis befinden ls -1 | wc -l. Dies wird verwendet wc, um die Anzahl der Zeilen (-l)in der Ausgabe von zu zählen ls -1. Dotfiles werden nicht gezählt. Bitte beachte, dassls -l (das ist ein "L" anstelle einer "1" wie in den vorherigen Beispielen), die ich in früheren Versionen dieses HOWTO verwendet habe, Ihnen tatsächlich eine Dateianzahl gibt, die um eins größer ist als die tatsächliche Anzahl. Vielen Dank an Kam Nejad für diesen Punkt.
Wenn Sie nur Dateien zählen und KEINE symbolischen Links einfügen möchten (nur ein Beispiel dafür, was Sie sonst noch tun könnten), können Sie dies verwenden ls -l | grep -v ^l | wc -l(diesmal ist dies ein "L", keine "1", wir möchten hier eine "lange" Auflistung). . grepsucht nach Zeilen, die mit "l" beginnen (was auf einen Link hinweist), und verwirft diese Zeile (-v).
Relative Geschwindigkeit: "ls -1 / usr / bin / | wc -l" dauert auf einem entladenen 486SX25 ungefähr 1,03 Sekunden (/ usr / bin / auf diesem Computer hat 355 Dateien). ""ls -l /usr/bin/ | grep -v ^l | wc -l " dauert etwa 1,19 Sekunden.
ls -lmuss statsyscall für jede Datei ausführen, um ihre Größe, mtime und andere Eigenschaften zu lesen, was langsam ist. In großen Verzeichnissen (über 100.000 Dateien) ls -lkann die Ausführung einige Minuten dauern. Um also nur Dateien zu zählen, verwenden Sie immer ls -1 | wc -l.
Marki555
A 486SX25, nice
cam8001
ls -1kann in großen Verzeichnissen immer noch langsam sein, da die Dateien sortiert werden müssen. Tut einfach printf '%s\n' *das Gleiche und vermeidet den externen lsAufruf (der sowieso problematisch ist ), aber die effizienteste Lösung besteht darin, einen Befehl zu verwenden, der keine Sortierung durchführt, wie z find. (Die Glob-Ausgabe ist nach der Shell sortiert.)
Tripleee
4
Wenn Sie einen bestimmten Dateityp rekursiv zählen müssen , können Sie Folgendes tun:
find YOUR_PATH -name '*.html'-type f | wc -l
-l dient nur zur Anzeige der Anzahl der Zeilen in der Ausgabe.
Die Erweiterung ist Teil des Dateinamens und repräsentiert möglicherweise nicht die Datei TYPE
Waxhead
4
Mit Bash:
Erstellen Sie ein Array von Einträgen mit () und erhalten Sie die Anzahl mit #.
FILES=(./*); echo ${#FILES[@]}
Ok, das zählt Dateien nicht rekursiv, aber ich wollte zuerst die einfache Option zeigen. Ein häufiger Anwendungsfall kann das Erstellen von Rollover-Sicherungen einer Datei sein. Dadurch werden logfile.1, logfile.2, logfile.3 usw. erstellt.
CNT=(./logfile*); mv logfile logfile.${#CNT[@]}
Rekursive Zählung mit globstaraktiviertem Bash 4+ (wie von @tripleee erwähnt)
FILES=(**/*); echo ${#FILES[@]}
Um die Anzahl der Dateien rekursiv zu ermitteln, können wir find weiterhin auf die gleiche Weise verwenden.
Moderne Shells unterstützen die **/*rekursive Aufzählung. Es ist immer noch weniger effizient als findbei großen Verzeichnissen, da die Shell die Dateien in jedem Verzeichnis sortieren muss.
Tripleee
2
Für Verzeichnisse mit Leerzeichen im Namen ... (basierend auf verschiedenen Antworten oben) - Drucken Sie den Verzeichnisnamen rekursiv mit der Anzahl der Dateien in:
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
Beispiel (zur besseren Lesbarkeit formatiert):
pwd
/mnt/Vancouver/Programming/scripts/claws/corpus
ls -l
total 8
drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'
ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
138
## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
29
Die Verzeichnisstruktur wird besser visualisiert mit tree:
tree -L 3 -F .
.
├── Catabolism - Autophagy; Phagosomes; Mitophagy/
│ ├── 1
│ ├── 10
│ ├── [ ... SNIP! (138 files, total) ... ]
│ ├── 98
│ └── 99
└── Catabolism - Lysosomes/
├── 1
├── 10
├── [ ... SNIP! (28 files, total) ... ]
├── 8
├── 9
└── aaa/
└── bbb
3 directories, 167 files
man find | grep mindep
-mindepth levels
Do not apply any tests or actions at levels less than levels
(a non-negative integer). -mindepth 1 means process all files
except the starting-points.
find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1
Anwendung: Ich möchte die maximale Anzahl von Dateien unter mehreren hundert Verzeichnissen finden (alle Tiefe = 1) [Ausgabe unten zur besseren Lesbarkeit erneut formatiert]:
sort -Vist eine natürliche Sorte. ... Meine maximale Anzahl von Dateien in einem dieser Verzeichnisse (Claws Mail) beträgt 4375 Dateien. Wenn ich diese Dateinamen - https://stackoverflow.com/a/55409116/1904943 ) mit dem linken Pad ( https://stackoverflow.com/a/55409116/1904943 ) - sie werden alle numerisch benannt, beginnend mit 1 in jedem Verzeichnis - und mit insgesamt 5 Ziffern auffülle, sollte ich in Ordnung sein .
Nachtrag
Suchen Sie die Gesamtzahl der Dateien und Unterverzeichnisse in einem Verzeichnis.
$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS
$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News
Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine
$ find . -type f | wc -l
70214 ## files
$ find . -type d | wc -l
417 ## subdirectories
Ich habe ffcnt geschrieben , um die rekursive unter bestimmten Umständen zu beschleunigen: Rotationsdisketten und Dateisysteme, die die Extent-Zuordnung unterstützen.
Es kann eine Größenordnung schneller sein als lsoder findbasierend auf Ansätzen, aber YMMV.
Dies beantwortet zunächst nicht die Frage. Die Frage betrifft das rekursive Zählen von Dateien aus einem Verzeichnis vorwärts, und der angezeigte Befehl führt dies nicht aus. Außerdem zählen Sie mit ls sowohl Verzeichnisse als auch Dateien. Es gibt auch keinen Grund, eine alte Frage zu beantworten, wenn Sie nichts Neues hinzufügen und die Frage nicht einmal richtig lesen. Bitte unterlassen Sie dies.
XFCC
-1
Dieser alternative Ansatz mit Filterung nach Format zählt alle verfügbaren Grub-Kernel-Module:
¦
(ASCII 166) mit dem vertikalen Balken|
(ASCII 124), der für die UNIX-Pipeline verwendet wird .*
das ASCII-Zeichen "Stern", aber "Zeiten" in einigen anderen Kontexten.Antworten:
Das sollte funktionieren:
Erläuterung:
-type f
nur Dateien einschließen.|
( und nicht¦
) leitetfind
die Standardausgabe deswc
Befehls zur Standardeingabe des Befehls um.wc
(Abkürzung für Word Count) zählt Zeilenumbrüche, Wörter und Bytes in seiner Eingabe ( docs ).-l
nur Zeilenumbrüche zählen.Anmerkungen:
DIR_NAME
durch.
, um den Befehl im aktuellen Ordner auszuführen.-type f
Verzeichnisse (und Symlinks) entfernen , um sie in die Zählung aufzunehmen.Erklärung, warum Ihr Beispiel nicht funktioniert:
In dem Befehl, den Sie angezeigt haben, verwenden Sie nicht die "Pipe" (
|
), um zwei Befehle zu verbinden, sondern die unterbrochene Leiste (¦
), die die Shell nicht als Befehl oder ähnliches erkennt. Deshalb erhalten Sie diese Fehlermeldung.quelle
f
In-type f
steht für Dateien undwc -l
für Wortzählzeilen.-type f
Verzeichnisse, um sie in die Zählung aufzunehmen-print
Flagge-print0
Flag verwenden.wc
hat die Option, eine nullterminierte Liste zu lesen. Siehe meine Antwort für eine Alternative.Für das aktuelle Verzeichnis:
quelle
.
find .
Wenn Sie eine Aufschlüsselung der Anzahl der Dateien in jedem Verzeichnis unter Ihrem aktuellen Verzeichnis wünschen:
Das kann natürlich alles in einer Zeile gehen. Die Klammern verdeutlichen, wessen Ausgabe
wc -l
(find $i -type f
in diesem Fall) überwacht werden soll .quelle
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do
Problem zu beheben. Siehe Wie kann ich eine Datei (Datenstrom, Variable) Zeile für Zeile (und / oder Feld für Feld) lesen?find
für die äußere Schleife ist nur eine unnötige Komplikation.for i in */
;; do`Sie können verwenden
nach der Installation des Tree- Pakets mit
(auf einem Debian / Mint / Ubuntu Linux-Computer).
Der Befehl zeigt nicht nur die Anzahl der Dateien, sondern auch die Anzahl der Verzeichnisse separat an. Mit der Option -L kann die maximale Anzeigeebene angegeben werden (die standardmäßig die maximale Tiefe des Verzeichnisbaums ist).
Mit der
-a
Option können auch ausgeblendete Dateien eingefügt werden.quelle
-a
Option angeben, um sie einzuschließen.brew
und führen Sie es ausbrew install tree
, vorzugsweise nach dem Ausführenbrew update
.Auf meinem Computer
rsync
ist ein bisschen schneller alsfind | wc -l
in der akzeptierten Antwort:Die zweite Zeile enthält die Anzahl der Dateien, im obigen Beispiel 150.481. Als Bonus erhalten Sie auch die Gesamtgröße (in Bytes).
Bemerkungen:
--dry-run
(oder-n
kurz gesagt) Option ist wichtig, um die Dateien nicht tatsächlich zu übertragen!-x
Option verwendet, um "Dateisystemgrenzen nicht zu überschreiten". Wenn Sie sie ausführen/
und externe Festplatten angeschlossen haben, werden nur die Dateien auf der Root-Partition gezählt.quelle
find ~ -type f | wc -l
dauerte es 1,7 / 0,5 / 1,33 Sekunden (real / user / sys).rsync --stats --dry-run -ax ~ /xxx
dauerte 4,4 / 3,1 / 2,1 Sekunden. Das sind ungefähr 500.000 Dateien auf SSD.Number of files: 487 (reg: 295, dir: 192)
rsync version 2.6.9 protocol version 29
Da Dateinamen in UNIX möglicherweise Zeilenumbrüche enthalten (ja, Zeilenumbrüche), werden
wc -l
möglicherweise zu viele Dateien gezählt. Ich würde für jede Datei einen Punkt drucken und dann die Punkte zählen:quelle
Wenn Sie einige der Antworten hier zusammenfassen, scheint die nützlichste Lösung zu sein:
Es kann seltsame Dinge wie Dateinamen verarbeiten, die Leerzeichen in Klammern und sogar neue Zeilen enthalten. Außerdem wird die Ausgabe nach der Anzahl der Dateien sortiert.
Sie können die Anzahl nach erhöhen
-maxdepth
, um auch Unterverzeichnisse zu zählen. Beachten Sie, dass dies möglicherweise lange dauern kann, insbesondere wenn Sie eine stark verschachtelte Verzeichnisstruktur in Kombination mit einer hohen-maxdepth
Anzahl haben.quelle
echo -e
? Ich denke, Sie setzen es ein, um alle Zeilenumbrüche zu falten, aber es wird auch jedes andere unregelmäßige Leerzeichen entstellen und versuchen, alle in den Dateinamen wörtlich vorhandenen Platzhalterzeichen zu erweitern. Ich würde einfach mit so etwas anfangenfind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'
und mit Aberrationen in der Ausgabe leben oder vielleicht mit Bashs spielen,printf "%q"
um den Verzeichnisnamen zu drucken.Wenn Sie wissen möchten, wie viele Dateien und Unterverzeichnisse aus dem aktuellen Arbeitsverzeichnis vorhanden sind, können Sie diesen Einzeiler verwenden
Dies funktioniert in der GNU-Variante und lässt das -e im Echo-Befehl für BSD Linux (z. B. OSX) einfach weg.
quelle
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
echo -e
(oder nur "Echo" wie im vorhergehenden Kommentar) eines nicht zitierten Verzeichnisnamens tauscht ein Problem gegen ein anderes aus.Wenn Sie Fehlerfälle vermeiden möchten, lassen Sie dies nicht zu
wc -l
Fehlerfälle Dateien mit Zeilenumbrüchen anzeigen (die als 2+ Dateien gelten).Beispiel: Stellen Sie sich einen Fall vor, in dem eine einzelne Datei mit einem einzelnen EOL-Zeichen enthalten ist
Da gnu zumindest
wc
keine Option zum Lesen / Zählen einer nullterminierten Liste (außer aus einer Datei) zu haben scheint, besteht die einfachste Lösung darin, die Dateinamen nicht zu übergeben, sondern jedes Mal eine statische Ausgabe, wenn eine Datei gefunden wird, z im selben Verzeichnis wie obenOder wenn Sie es
find
unterstützenquelle
Sie können den Befehl verwenden
ncdu
. Es wird rekursiv gezählt, wie viele Dateien ein Linux-Verzeichnis enthält. Hier ist ein Beispiel für die Ausgabe:Es hat einen Fortschrittsbalken, der praktisch ist, wenn Sie viele Dateien haben:
So installieren Sie es unter Ubuntu:
Benchmark: Ich habe https://archive.org/details/cv_corpus_v1.tar (380390 Dateien, 11 GB) als Ordner verwendet, in dem die Anzahl der Dateien gezählt werden muss.
find . -type f | wc -l
: ca. 1m20s zu vervollständigenncdu
: ca. 1m20s zu vervollständigenquelle
find . -type f | wc -l
und festgestelltncdu
.find
unter der Haube mehr oder weniger dieselben Systemaufrufe ausgeführt werden, fürdu
die das Backend bestimmt istncdu
. Einfach gespannt.Beispielausgabe:
quelle
Geben Sie ein, um festzustellen, wie viele Dateien sich im aktuellen Verzeichnis befinden
ls -1 | wc -l
. Dies wird verwendetwc
, um die Anzahl der Zeilen(-l)
in der Ausgabe von zu zählenls -1
. Dotfiles werden nicht gezählt. Bitte beachte, dassls -l
(das ist ein "L" anstelle einer "1" wie in den vorherigen Beispielen), die ich in früheren Versionen dieses HOWTO verwendet habe, Ihnen tatsächlich eine Dateianzahl gibt, die um eins größer ist als die tatsächliche Anzahl. Vielen Dank an Kam Nejad für diesen Punkt.Wenn Sie nur Dateien zählen und KEINE symbolischen Links einfügen möchten (nur ein Beispiel dafür, was Sie sonst noch tun könnten), können Sie dies verwenden
ls -l | grep -v ^l | wc -l
(diesmal ist dies ein "L", keine "1", wir möchten hier eine "lange" Auflistung). .grep
sucht nach Zeilen, die mit "l" beginnen (was auf einen Link hinweist), und verwirft diese Zeile (-v).Relative Geschwindigkeit: "ls -1 / usr / bin / | wc -l" dauert auf einem entladenen 486SX25 ungefähr 1,03 Sekunden (/ usr / bin / auf diesem Computer hat 355 Dateien). ""
ls -l /usr/bin/ | grep -v ^l | wc -l
" dauert etwa 1,19 Sekunden.Quelle: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
quelle
ls -l
mussstat
syscall für jede Datei ausführen, um ihre Größe, mtime und andere Eigenschaften zu lesen, was langsam ist. In großen Verzeichnissen (über 100.000 Dateien)ls -l
kann die Ausführung einige Minuten dauern. Um also nur Dateien zu zählen, verwenden Sie immerls -1 | wc -l
.ls -1
kann in großen Verzeichnissen immer noch langsam sein, da die Dateien sortiert werden müssen. Tut einfachprintf '%s\n' *
das Gleiche und vermeidet den externenls
Aufruf (der sowieso problematisch ist ), aber die effizienteste Lösung besteht darin, einen Befehl zu verwenden, der keine Sortierung durchführt, wie zfind
. (Die Glob-Ausgabe ist nach der Shell sortiert.)Wenn Sie einen bestimmten Dateityp rekursiv zählen müssen , können Sie Folgendes tun:
-l
dient nur zur Anzeige der Anzahl der Zeilen in der Ausgabe.quelle
Mit Bash:
Erstellen Sie ein Array von Einträgen mit () und erhalten Sie die Anzahl mit #.
Ok, das zählt Dateien nicht rekursiv, aber ich wollte zuerst die einfache Option zeigen. Ein häufiger Anwendungsfall kann das Erstellen von Rollover-Sicherungen einer Datei sein. Dadurch werden logfile.1, logfile.2, logfile.3 usw. erstellt.
Rekursive Zählung mit
globstar
aktiviertem Bash 4+ (wie von @tripleee erwähnt)Um die Anzahl der Dateien rekursiv zu ermitteln, können wir find weiterhin auf die gleiche Weise verwenden.
quelle
**/*
rekursive Aufzählung. Es ist immer noch weniger effizient alsfind
bei großen Verzeichnissen, da die Shell die Dateien in jedem Verzeichnis sortieren muss.Für Verzeichnisse mit Leerzeichen im Namen ... (basierend auf verschiedenen Antworten oben) - Drucken Sie den Verzeichnisnamen rekursiv mit der Anzahl der Dateien in:
Beispiel (zur besseren Lesbarkeit formatiert):
Die Verzeichnisstruktur wird besser visualisiert mit
tree
:ls -p | grep -v /
(unten verwendet) stammt aus Antwort 2 unter /unix/48492/list-only-regular-files-but-not-directories-in-current-directoryAnwendung: Ich möchte die maximale Anzahl von Dateien unter mehreren hundert Verzeichnissen finden (alle Tiefe = 1) [Ausgabe unten zur besseren Lesbarkeit erneut formatiert]:
sort -V
ist eine natürliche Sorte. ... Meine maximale Anzahl von Dateien in einem dieser Verzeichnisse (Claws Mail) beträgt 4375 Dateien. Wenn ich diese Dateinamen - https://stackoverflow.com/a/55409116/1904943 ) mit dem linken Pad ( https://stackoverflow.com/a/55409116/1904943 ) - sie werden alle numerisch benannt, beginnend mit 1 in jedem Verzeichnis - und mit insgesamt 5 Ziffern auffülle, sollte ich in Ordnung sein .Nachtrag
Suchen Sie die Gesamtzahl der Dateien und Unterverzeichnisse in einem Verzeichnis.
quelle
Ich habe ffcnt geschrieben , um die rekursive unter bestimmten Umständen zu beschleunigen: Rotationsdisketten und Dateisysteme, die die Extent-Zuordnung unterstützen.
Es kann eine Größenordnung schneller sein als
ls
oderfind
basierend auf Ansätzen, aber YMMV.quelle
Hier gibt es viele richtige Antworten. Hier ist ein anderes!
Wo
.
ist der Ordner, in dem gesucht werden soll, und10
die Anzahl der Zeichen, nach denen das Verzeichnis gruppiert werden soll.quelle
find -type f | wc -l
ODER (Wenn das Verzeichnis das aktuelle Verzeichnis ist)
finden . -Typ f | wc -l
quelle
Dies wird völlig gut funktionieren. Einfach kurz. Wenn Sie die Anzahl der in einem Ordner vorhandenen Dateien zählen möchten.
quelle
Dieser alternative Ansatz mit Filterung nach Format zählt alle verfügbaren Grub-Kernel-Module:
quelle
quelle