GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Finden Sie Verzeichnisse, die eine bestimmte Anzahl von Dateien enthalten

Sie könnten dies versuchen, um die Namen der Unterverzeichnisse und die Anzahl der darin enthaltenen Dateien/Verzeichnisse zu erhalten:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Wenn Sie dasselbe für alle Unterverzeichnisse tun möchten (rekursive Suche), verwenden Sie stattdessen Folgendes:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

So wählen Sie die Verzeichnisse aus, die genau 10 Dateien enthalten:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 oder mehr:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 oder weniger:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

Wenn Sie nur den Verzeichnisnamen behalten möchten (z. B. wenn Sie ihn wie von @evilsoup vorgeschlagen an einen anderen Prozess weiterleiten möchten), können Sie Folgendes verwenden:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

Um unmittelbare Unterverzeichnisse aufzulisten, die genau enthalten $NUM Dateien.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

Um unmittelbare Unterverzeichnisse aufzulisten, die größer enthalten als $NUM Dateien.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

Um unmittelbare Unterverzeichnisse aufzulisten, die weniger enthalten als $NUM Dateien.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

Elemente werden durch ein Nullzeichen \0 abgeschlossen , sodass Dateinamen, die Zeilenumbrüche oder andere Arten von Leerzeichen enthalten, korrekt interpretiert werden. Die %h druckt den dirname jeder Datei . awk verwendet dann ein Array, um zu zählen, wie oft es auf jedes Verzeichnis trifft, und gibt es aus, wenn die Bedingungen erfüllt sind.

Bitte beachten Sie, dass keiner der oben genannten Befehle Verzeichnisse anzeigt, die keine Dateien enthalten. Beachten Sie auch, dass ich mich mit Datei auf normale Dateien beziehe, nicht Links, Verzeichnisse, Sockets, Blöcke, benannte Pipes usw.

Ich habe versucht, dies so einfach wie möglich zu machen. Wenn Sie rekursive Unterverzeichnisse oder die darin enthaltenen Dateien finden möchten, ist ein modifizierter Befehl erforderlich. Es gibt zu viele Möglichkeiten, um sie alle aufzulisten.


Versuchen Sie Folgendes:

[ `finden . | wc -l` -eq 10 ] &&echo "Gefunden"

[ `finden . | wc -l` -gt 10 ] &&echo "Gefunden"

[ `finden . | wc -l` -lt 10 ] &&echo "Gefunden"

In diesem Beispiel können Sie überprüfen, ob das aktuelle Verzeichnis genau 10, mehr als 10 und weniger als 10 Dateien/Verzeichnisse enthält. Wenn Sie mehrere Verzeichnisse überprüfen müssen, verwenden Sie einfach loop.


Linux
  1. So finden Sie die Anzahl der Dateien in einem Verzeichnis und Unterverzeichnissen

  2. Finden Sie die größten Dateien und Verzeichnisse in Linux

  3. Wie benutzt man WC und Piping, um herauszufinden, wie viele Dateien und Verzeichnisse sich in einem bestimmten Verzeichnis befinden?

  4. Anzahl der Dateien, die eine bestimmte Zeichenfolge enthalten?

  5. Größte Dateien oder Verzeichnisse finden?

Find-Befehl in Linux (Dateien und Verzeichnisse suchen)

3 Möglichkeiten, Dateien und Verzeichnisse in Linux zu finden

Finden Sie Dateien und Verzeichnisse unter Linux ganz einfach

Linux:Anzahl der Dateien in einem Verzeichnis und Unterverzeichnissen finden

du zählt eher die Anzahl der Dateien/Verzeichnisse als die Größe

Schnellere Möglichkeit, eine große Anzahl von Dateien zu löschen