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.