Vous pouvez essayer ceci, pour obtenir les noms des sous-répertoires et le nombre de fichiers/répertoires qu'ils contiennent :
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Si vous voulez faire la même chose pour tous les sous-répertoires (recherche récursive), utilisez ceci à la place :
find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Pour sélectionner les répertoires contenant exactement 10 fichiers :
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF==10'
10 ou plus :
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF>=10'
10 ou moins :
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF<=10'
Si vous souhaitez conserver uniquement le nom du répertoire (par exemple, si vous souhaitez le diriger vers un autre processus en aval, comme suggéré par @evilsoup), vous pouvez utiliser ceci :
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; |
awk -F"\t" '$NF<=10{print $1}'
Pour lister les sous-répertoires immédiats contenant exactement $NUM
fichiers.
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}'
Pour lister les sous-répertoires immédiats contenant grand supérieur à $NUM
fichiers.
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}'
Pour lister les sous-répertoires immédiats contenant moins supérieur à $NUM
fichiers.
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}'
Les éléments sont terminés par un caractère nul \0
, ainsi les noms de fichiers qui contiennent des retours à la ligne ou d'autres types d'espaces blancs seront interprétés correctement. Le %h
imprime le dirname
de chaque fichier . awk
utilise ensuite un tableau pour compter le nombre de fois qu'il rencontre chaque répertoire, en l'affichant si les conditions sont remplies.
Veuillez noter qu'aucune des commandes susmentionnées n'affichera les répertoires contenant zéro fichier. Notez également que par fichier, je fais référence à des fichiers normaux, pas liens, répertoires, sockets, blocs, tubes nommés, etc.
J'ai essayé de faire ça le plus simplement possible. Si vous souhaitez rechercher des sous-répertoires récursifs ou les fichiers qu'ils contiennent, une commande modifiée est requise. Il y a trop de possibilités pour toutes les énumérer.
Essayez ceci :
[ `trouver . | wc -l` -eq 10 ] &&echo "Trouvé"
[ `trouver . | wc -l` -gt 10 ] &&echo "Trouvé"
[ `trouver . | wc -l` -lt 10 ] &&echo "Trouvé"
Dans ces exemples, vous pouvez vérifier si le répertoire CURRENT contient exactement 10, plus de 10 et moins de 10 fichiers/répertoires. Si vous avez besoin de vérifier un tas de répertoires, utilisez simplement la boucle.