it-swarm.com.de

Dateien in einem Linux-Verzeichnis rekursiv zählen

Wie kann ich Dateien in einem Linux-Verzeichnis rekursiv zählen?

Ich habe das gefunden:

find DIR_NAME -type f ¦ wc -l

Aber wenn ich dies ausführe, wird der folgende Fehler zurückgegeben.

find: path muss vor expression stehen: ¦

630
Robert Buckley

Das sollte funktionieren:

find DIR_NAME -type f | wc -l

Erklärung:

  • -type f, um nur Dateien einzuschließen.
  • | ( und nicht ¦) leitet die Standardausgabe des Befehls find an die Standardeingabe des Befehls wc weiter .
  • wc (Abkürzung für Word Count) zählt Zeilenumbrüche, Wörter und Bytes in seiner Eingabe ( docs ).
  • -l um nur Zeilenumbrüche zu zählen.

Anmerkungen:

  • Ersetzen Sie DIR_NAME durch ., um den Befehl im aktuellen Ordner auszuführen.
  • Sie können auch den -type f entfernen, um Verzeichnisse (und Symlinks) 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 gezeigt haben, verwenden Sie nicht die "Pipe" (|), um zwei Befehle zu verbinden, sondern den unterbrochenen Balken (¦), den die Shell nicht als Befehl oder erkennt sowas ähnliches. Deshalb erhalten Sie diese Fehlermeldung.

1145
paulsm4

Für das aktuelle Verzeichnis:

find -type f | wc -l
86
Abhishek Maurya

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 auf einer Linie gehen. Die Klammern verdeutlichen, wessen Ausgabe wc -l angezeigt werden soll (find $i -type f in diesem Fall).

62
Greg Bell

Sie können verwenden

$ tree

nach der Installation des Baum Pakets mit

$ Sudo apt-get install tree

(auf einem Debian/Mint/Ubuntu Linux-Rechner).

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 (standardmäßig die maximale Tiefe des Verzeichnisbaums).

Versteckte Dateien können ebenfalls eingebunden werden, indem die Option -a angegeben wird.

47
lev

Auf meinem Computer ist rsync in der akzeptierten Antwort etwas schneller als find | wc -l. Zum Beispiel können Sie die Dateien in /Users/joe/ wie folgt zählen:

[joe:~] $ rsync --stats --dry-run -ax /Users/joe/ /xxx

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., daher ist sie größer als die zweite Zeile.
  • die Option --dry-run (oder kurz -n) ist wichtig, um die Dateien nicht tatsächlich zu übertragen!
  • der Parameter /xxx kann ein beliebiger leerer oder nicht vorhandener Ordner sein. Verwenden Sie hier nicht /.
  • Ich habe die Option -x verwendet, um "keine Dateisystemgrenzen zu überschreiten". Wenn Sie sie für / ausführen und externe Festplatten angeschlossen haben, werden nur die Dateien auf der Root-Partition gezählt.
38
psmith

Da Dateinamen in UNIX möglicherweise Zeilenumbrüche enthalten (Ja, Zeilenumbrüche), zählt wc -l möglicherweise zu viele Dateien. Ich würde einen Punkt für jede Datei drucken und dann die Punkte zählen:

find DIR_NAME -type f -printf "." | wc -c
18
hek2mgl

Die nützlichste Lösung scheint zu sein, wenn Sie hier mehrere Antworten zusammenfassen:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

Es kann seltsame Dinge wie Dateinamen verarbeiten, die Leerzeichen in Klammern und gerade neue Zeilen enthalten. Es sortiert auch die Ausgabe nach der Anzahl der Dateien.

Sie können die Anzahl nach -maxdepth erhöhen, um auch die 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 -Nummer haben.

15
Sebastian Meine

Wenn Sie wissen möchten, wie viele Dateien und Unterverzeichnisse im aktuellen Arbeitsverzeichnis vorhanden sind, können Sie diesen Einzeiler verwenden

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

Dies funktioniert in der GNU-Variante und lässt einfach das -e aus dem Echo-Befehl für BSD-Linux (z. B. OSX) weg.

8
Santrix

Wenn Sie Fehlerfälle vermeiden möchten, erlauben Sie wc -l nicht, Dateien mit Zeilenumbrüchen zu sehen (die als 2+ Dateien gelten).

z.B. 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 wc anscheinend keine Option zum Lesen/Zählen einer nullterminierten Liste (außer aus einer Datei) hat, ist es die einfachste Lösung, nicht die Dateinamen, sondern jedes Mal eine statische Ausgabe zu übergeben Datei gefunden wird, zB im selben Verzeichnis wie oben

> find -type f -exec printf '\n' \; | wc -l
1

Oder wenn Ihr find es unterstützt

> find -type f -printf '\n' | wc -l
1 
7
BroSlow

Sie können den Befehl ncdu verwenden. Es wird rekursiv gezählt, wie viele Dateien ein Linux-Verzeichnis enthält. Hier ist ein Beispiel für die Ausgabe:

enter image description here

Es hat einen Fortschrittsbalken, der praktisch ist, wenn Sie viele Dateien haben:

enter image description here

So installieren Sie es unter Ubuntu:

Sudo apt-get install -y ncdu

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: Etwa 1 bis 20 Sekunden
  • ncdu: Um 1m20s zu vervollständigen
5
tree $DIR_PATH | tail -1

Beispielausgabe:

5309 Verzeichnisse, 2122 Dateien

5
Nestor Urquiza

Geben Sie ls -1 | wc -l ein, um festzustellen, wie viele Dateien sich im aktuellen Verzeichnis befinden. Dies verwendet wc, um die Anzahl der Zeilen (-l) in der Ausgabe von ls -1 zu zählen. Dotfiles werden nicht gezählt. Bitte beachten Sie, dass ls -l (das ist ein "L" anstelle einer "1" wie in den vorherigen Beispielen), das ich in früheren Versionen dieses HOWTOs verwendet habe, Ihnen tatsächlich eine um eins höhere Dateianzahl als die tatsächliche Anzahl gibt. 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 ls -l | grep -v ^l | wc -l verwenden (diesmal ist dies ein "L" und keine "1", wir möchten ein " lange "Auflistung hier). 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" benötigt 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 ungefähr 1,19 Sekunden.

Quelle: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html

4
Sophy

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.

3
LeOn - Han Li

Mit Bash:

Erstellen Sie mit () ein Array von Einträgen und ermitteln 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 die Dateien logfile.1, logfile.2, logfile.3 usw. erstellt.

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

Rekursive Zählung mit Bash 4+ globstar aktiviert (wie von @tripleee erwähnt)

FILES=(**/*); echo ${#FILES[@]}

Um die Anzahl der Dateien rekursiv zu ermitteln, können wir find auf dieselbe Weise verwenden.

FILES=(`find . -type f`); echo ${#FILES[@]}
2
nickl-

Bei Verzeichnissen mit Leerzeichen im Namen ... (basierend auf den obigen Antworten) - Verzeichnisnamen rekursiv mit der Anzahl der Dateien ausgeben:

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 lässt sich mit tree besser visualisieren:

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.

ls -p | grep -v / (wird unten verwendet) stammt aus Antwort 2 unter https://unix.stackexchange.com/questions/48492/list-only-regular-files-but-not-directories-in-current- Verzeichnis

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 neu formatiert]:

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[[email protected] 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[[email protected] 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -V ist eine natürliche Art. ... Also, meine maximale Anzahl von Dateien in einem dieser Verzeichnisse (Claws Mail) ist 4375 Dateien. Wenn ich diese Dateinamen mit dem linken Pad ( https://stackoverflow.com/a/55409116/190494 ) belasse, werden sie alle numerisch benannt, beginnend mit 1 in jedem Verzeichnis, und mit dem Pad bis 5 insgesamt ziffern sollte ich ok 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
1
Victoria Stuart

Ich habe ffcnt geschrieben, um die rekursive Dateizählung unter bestimmten Umständen zu beschleunigen: Rotationsdisketten und Dateisysteme, die das Extent-Mapping unterstützen.

Es kann eine Größenordnung schneller sein als auf ls oder find basierende Ansätze, aber YMMV.

1
the8472

Hier gibt es viele richtige Antworten. Hier ist ein anderes!

find . -type f | sort | uniq -w 10 -c

dabei ist . der Ordner, in dem gesucht werden soll, und 10 die Anzahl der Zeichen, nach denen das Verzeichnis gruppiert werden soll.

0
pufferfish