Antworten:
Sie sollten einen Befehl wie diesen verwenden:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: Suche nach Dateien auf dem gewünschten Pfad. Wenn Sie nicht möchten, dass es rekursiv ist, und Ihre find
Implementierung dies unterstützt, sollten Sie es -maxdepth 1
direkt vor der -exec
Option hinzufügen .exec
: weist den Befehl an, wc -l
für jede Datei ausgeführt zu werden.sort -rn
: Sortieren Sie die Ergebnisse in umgekehrter Reihenfolge. Vom Größeren zum Niedrigeren.(Dies setzt voraus, dass Dateinamen keine Zeilenumbrüche enthalten).
wc
auch eine total
Zeile gedruckt wird. Daher erhalten Sie hier auch eine oder mehrere "Gesamt" -Zeilen, sofern nicht nur eine Datei vorhanden ist . Sie können an leiten grep /
, um sie zu entfernen.
sort
Befehls
Wahrscheinlich die einfachste Version, wenn Sie keine Rekursivität benötigen:
wc -l /group/book/four/word/*|sort -n
wc
zählt Zeilen (Option -l
) in allen (aber versteckten) ( *
) Dateien unter /group/book/four/word/
und sort
sortiert das Ergebnis (durch die Pipe |
) numerisch (Option -n
).
Jemand machte einen Kommentar zu dieser Antwort und erwähnte grep -rlc
, bevor er sie unterdrückte. Dies grep
ist in der Tat eine großartige Alternative, insbesondere wenn Sie Rekursivität benötigen:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
zählt (Option -c
) rekursiv (Option -r
) Zeilen, die mit ( grep
) '^'
( dh Zeilenanfang) im Verzeichnis übereinstimmen /group/book/four/word/
. Dann müssen Sie den Doppelpunkt durch ein Leerzeichen ersetzen, z. B. mit tr
, um zu helfen sort
, die Sie numerisch (Option -n
) in der zweiten Spalte (Option -k2
) sortieren möchten .
Update: Siehe Stephanes Kommentar über mögliche Einschränkungen und wie Sie diese tatsächlich beseitigen können tr
.
grep -c .
zählt die Zeilen, die mindestens ein gültiges Zeichen enthalten. Mit dieser grep -c '^'
Option werden alle Zeilen gezählt (bei einigen grep
Implementierungen werden auch nachstehende Zeichen nach der letzten Zeile gezählt ). Beachten Sie, dass nicht alle grep
Implementierungen a unterstützen -r
und das Verhalten bei diesen Implementierungen unterschiedlich ist. Für brauchen Sie kein :
s (Doppelpunkt, kein Semikolon) in Leerzeichen zu übersetzen sort
. Verwenden Sie einfach -t:
. Beachten Sie, dass davon :
ausgegangen wird , dass Dateinamen keine Leerzeichen oder Zeilenumbrüche enthalten .
wc
ob man so einen handlichen Gesamtwert hat, wenn man mehrere Pfade passiert. Das Koppeln dieser Funktionalität mit dem Platzhalter und der Pipe zu sort
ist wirklich sauber.
Mit zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Wir definieren eine neue Sortierfunktion , dass Antworten mit der Anzahl der Zeilen in der Datei. Und wir verwenden das Glob-Qualifikationsmerkmal, das zusammen mit (für die numerische Sortierung) definiert, wie die Ergebnisse des Glob geordnet werden. ( auch hinzugefügt, um nur reguläre Dateien zu prüfen).lines
o+lines
n
.
Das setzt nicht voraus, welches Zeichen die Dateinamen enthalten dürfen, außer dass versteckte Dateien (die mit beginnen .
) weggelassen werden. Fügen Sie das D
Glob-Qualifikationsmerkmal hinzu, wenn Sie dies ebenfalls möchten.
bash
only ...
Sie geben nicht an, ob die Dateien auch in Unterverzeichnissen von gespeichert werden sollen /group/book/four/word
. Die find
Lösung in der Antwort von jherran wird in Unterverzeichnisse fallen. Wenn dies nicht gewünscht ist, verwenden Sie stattdessen die Shell:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Wenn Ihre Dateinamen Zeilenumbrüche enthalten können, können Sie Folgendes verwenden:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Schließlich, wenn Sie tun wollen in Verzeichnisse absteigen, können Sie dies in verwenden bash
4 oder höher:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Beachten Sie, dass Versionen bash
vor 4.3 beim rekursiven Absteigen des Verzeichnisbaums (wie zsh
's oder tcsh
' s ***/*
) Symlinks folgten .
Alle oben genannten Lösungen ignorieren auch versteckte Dateien (diejenigen, deren Name mit einem beginnt .
, um shopt -s dotglob
sie einzuschließen) und enthalten auch die Zeilenanzahl der symbolischen Links (was der find
Ansatz nicht tut).
-xtype f
in GNU find oder *(-.)
in zsh) berücksichtigt werden und versteckte Dateien weggelassen werden.
%lu
in printf
? Wie ich mich erinnere, bedeutet das lange vorzeichenlose Dezimalstellen. Ist das wirklich notwendig? Warum nicht die Zahl als Zeichenfolge behandeln? Macht es einen Unterschied?
0
anstelle der leeren Zeichenfolge auf erweitert, was etwas besser ist. Einige Sortierimplementierungen funktionieren mit Ganzzahlen ohne Vorzeichen, andere mit Vorzeichen. %lu
klingt wie die sicherste Wette, aber es ist wahrscheinlich egal, ob Sie 2^31
Linien haben, das wird eh Ewigkeiten dauern.
Wenn Sie fd
einen wirklich schnellen, in Rust geschriebenen Dateisucher installieren möchten (Sie sollten ihn installieren, es ist trotzdem toll, ihn zu haben)
fd --type=file . | xargs wc -l | sort -n
Grundsätzlich fd
listet xargs die Dateien auf wc
, übergibt sie an (steht für word count, wird aber mit -l gezählt) und sortiert sie schließlich von der geringsten Zeilenanzahl bis zur größten Verwendung sort -n
.
ls -l
gibt nicht die Anzahl der Zeilen an.ls -lS
sortiert Dateien mit einigenls
Implementierungen nach Größe ( Größe entspricht der Anzahl der Bytes im Inhalt).