Ich kann alle Verzeichnisse von auflisten
find ./ -type d
Ich habe versucht, den Inhalt jedes Verzeichnisses aufzulisten und die Anzahl der Dateien in jedem Verzeichnis mit dem folgenden Befehl zu zählen
find ./ -type d | xargs ls -l | wc -l
Dies summierte jedoch die Gesamtzahl der zurückgegebenen Zeilen
find ./ -type d | xargs ls -l
Gibt es eine Möglichkeit, die Anzahl der Dateien in jedem Verzeichnis zu zählen?
./
?Antworten:
Angenommen, Sie haben GNU gefunden, lassen Sie es die Verzeichnisse finden und lassen Sie bash den Rest erledigen:
quelle
find . -maxdepth 1 -type d | sort
; do y =find $x | wc -l
; Echo $ x, $ y; erledigtfind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
sollte aber in Ihrem ersten Kommentar in Anführungszeichen stehen, um Verzeichnisnamen mit Leerzeichen korrekt zu behandeln. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Dadurch wird die Anzahl der Dateien pro Verzeichnis für die aktuelle Verzeichnisebene gedruckt:
quelle
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Hinzufügen| sort -nr
, um nach der Anzahl anstelle des Verzeichnisnamens zu sortieren.find. -type f
um alle Elemente der Typdatei zu findencut -d/ -f2
um ihren spezifischen Ordner auszuschneidensort
um die Liste der Ordnernamen zu sortierenuniq -c
um zurückzugeben, wie oft jeder Ordnername gezählt wurdequelle
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Sie können veranlassen, alle Dateien zu finden, die Dateinamen zu entfernen, eine Zeile mit nur dem Verzeichnisnamen für jede Datei zu hinterlassen und dann zu zählen, wie oft jedes Verzeichnis angezeigt wird:
Das einzige Problem dabei ist, wenn Sie Dateinamen oder Verzeichnisnamen haben, die ein Zeilenumbruchzeichen enthalten, was ziemlich unwahrscheinlich ist. Wenn Sie sich wirklich Gedanken über Zeilenumbrüche in Dateinamen oder Verzeichnisnamen machen müssen, empfehlen wir Ihnen, diese zu finden und zu korrigieren, damit sie keine Zeilenumbrüche enthalten (und den Schuldigen leise vom Fehler ihres Weges zu überzeugen).
Wenn Sie an der Anzahl der Dateien in jedem Unterverzeichnis des aktuellen Verzeichnisses interessiert sind und alle Dateien in den Unterverzeichnissen zusammen mit den Dateien im unmittelbaren Unterverzeichnis zählen, würde ich den
sed
Befehl so anpassen , dass er nur gedruckt wird das Verzeichnis der obersten Ebene:Das erste Muster erfasst den Anfang des Namens, den Punkt, den Schrägstrich, den Namen bis zum nächsten Schrägstrich und den Schrägstrich und ersetzt die Zeile nur durch den ersten Teil.
wird ersetzt durch
Beim zweiten Ersetzen werden die Dateien direkt im aktuellen Verzeichnis erfasst. Sie haben am Ende keinen Schrägstrich und diese werden durch ersetzt
./
. Das Sortieren und Zählen funktioniert dann nur mit der Anzahl der Namen.quelle
find
. Einige könnten: Wenn es eine Datei gibtdir1/dir2/dir3/file1
, die aberdir1/dir2
nur Unterverzeichnisse enthält (keine einfachen Dateien), können Sie auf deren Vorhandensein schließen. Wenndir1/dir4
jedoch keine Dateien vorhanden sind, wird der Name einfach nicht angezeigt.Hier ist eine Möglichkeit, aber wahrscheinlich nicht die effizienteste.
Gibt eine Ausgabe wie folgt aus, mit Verzeichnisname gefolgt von der Anzahl der Einträge in diesem Verzeichnis. Beachten Sie, dass die Anzahl der Ausgaben auch Verzeichniseinträge enthält, die möglicherweise nicht Ihren Wünschen entsprechen.
quelle
bash
,ls
,wc
) für jedes Verzeichnis gefundenfind
.man bash
,A -- signals the end of options and disables further option processing
. In diesem Fall würde verhindert, dass eine als Teil des Funds gefundene falsch benannte Datei Teil der Argumentverarbeitung für bash wird.Die Lösung aller anderen hat den einen oder anderen Nachteil.
Erläuterung:
-type d
: Wir interessieren uns für Verzeichnisse.-readable
: Wir wollen sie nur, wenn es möglich ist , die darin enthaltenen Dateien aufzulisten. Beachten Sie, dassfind
immer noch ein Fehler ausgegeben wird, wenn versucht wird, nach weiteren Verzeichnissen in diesen zu suchen. Dies verhindert jedoch, dass diese aufgerufen-exec
werden.-exec sh -c BLAH sh {} ';'
: Führen Sie für jedes Verzeichnis dieses Skriptfragment mit$0
set tosh
und$1
set to the filename aus.printf "%s " "$1"
: Geben Sie den Verzeichnisnamen portabel und minimal aus, gefolgt von einem Leerzeichen und keinem Zeilenumbruch.ls -1UA
: Listen Sie die Dateien, eine pro Zeile, in Verzeichnisreihenfolge auf (um ein Abwürgen der Pipe zu vermeiden), wobei nur die speziellen Verzeichnisse.
und ausgeschlossen werden..
wc -l
: Zähle die Zeilenquelle
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Leicht modifizierte Version von Sebastians Antwort mit
find
anstelle vondu
(um den Aufwand für die Dateigröße auszuschließen, der ausgeführt werdendu
muss und der nie verwendet wird):-mindepth 2
Der Parameter wird verwendet, um Dateien im aktuellen Verzeichnis auszuschließen. Wenn Sie es entfernen, sehen Sie eine Reihe von Zeilen wie die folgenden:(ähnlich wie die
du
-basierte Variante)Wenn Sie die Dateien auch im aktuellen Verzeichnis zählen müssen, verwenden Sie diese erweiterte Version:
Die Ausgabe sieht wie folgt aus:
quelle
Dies kann auch durch Schleifen über ls anstelle von find erfolgen
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Erläuterung:
for f in */;
- Schleife über alle Verzeichnissedo echo "$f ->
- Drucken Sie jeden Verzeichnisnamen aus$(ls $f | wc -l)
- Rufen Sie ls für dieses Verzeichnis auf und zählen Sie die Zeilenquelle
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Dies sollte den Verzeichnisnamen gefolgt von der Anzahl der Dateien im Verzeichnis zurückgeben.
Beispielausgabe:
Dies
export -f
ist erforderlich, da das-exec
Argument vonfind
die Ausführung einer Bash-Funktion nur erlaubt, wenn Sie Bash explizit aufrufen und die im aktuellen Bereich definierte Funktion explizit in die neue Shell exportieren müssen.quelle
./dir1/dir2/dir3
(Zählen der Dateien indir1
und ihrer Unterverzeichnisse zusammen, anstatt die Dateiendir1/dir2/dir3
getrennt von denen indir1/dir2
und beide getrennt von denen in zu zählen/dir1
).finden . -Typ f -printf '% h \ n' | sortieren | uniq -c
gibt zum Beispiel:
quelle
Ich habe die Antwort von @glenn jackman und die Antwort von @ pcarvalho kombiniert (in der Kommentarliste stimmt etwas mit der Antwort von pcarvalho nicht, weil die zusätzliche Stilsteuerungsfunktion des Zeichens ' ` ' (Backtick)).
Mein Skript kann den Pfad als Erweiterung akzeptieren und die Verzeichnisliste nach sortieren.
ls -l
Außerdem kann es das Problem des "Speicherplatzes im Dateinamen" behandeln .Meine erste Antwort in Stackoverflow, und ich hoffe, es kann jemandem helfen ^ _ ^
quelle
Ich habe es mit einigen der anderen hier versucht, aber am Ende waren Unterordner in der Anzahl der Dateien enthalten, als ich nur die Dateien haben wollte. Dies wird
./folder/path<tab>nnn
mit der Anzahl der Dateien ohne Unterordner für jeden Unterordner im aktuellen Ordner gedruckt.quelle
Einfache Möglichkeit, Dateien eines bestimmten Typs rekursiv zu finden. In diesem Fall JPG-Dateien für alle Ordner im aktuellen Verzeichnis:
find . -name *.jpg -print | wc -l
quelle
Ein superschneller Wunderbefehl, der Dateien rekursiv durchläuft, um die Anzahl der Bilder in einem Verzeichnis zu zählen und die Ausgabe nach Bilderweiterung zu organisieren:
Credits: https://unix.stackexchange.com/a/386135/354980
quelle
Dies könnte eine andere Möglichkeit sein, die Verzeichnisstrukturen zu durchsuchen und Tiefenergebnisse zu liefern.
quelle
Dies ergibt die Gesamtzahl.
quelle