J'espérais pouvoir le faire avec la find
commande mais je ne vois aucun test dans le manuel pour faire ce que je veux. Je voudrais pouvoir trouver dans le répertoire de travail tous les répertoires contenant moins que, plus que ou exactement le nombre que je spécifie.
find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
Mais hélas, il n'y a pas une telle option.
Réponses:
Vous pouvez essayer ceci, pour obtenir les noms des sous-répertoires et le nombre de fichiers / répertoires qu'ils contiennent:
Si vous souhaitez faire de même pour tous les sous-répertoires (recherche récursive), utilisez plutôt ceci:
Pour sélectionner les répertoires contenant exactement 10 fichiers:
10 ou plus:
10 ou moins:
Si vous souhaitez conserver uniquement le nom du répertoire (par exemple, si vous souhaitez le rediriger vers un autre processus en aval comme l'a suggéré @evilsoup), vous pouvez utiliser ceci:
la source
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
Pour répertorier les sous-répertoires immédiats contenant exactement les
$NUM
fichiers.Pour répertorier les sous-répertoires immédiats contenant des
$NUM
fichiers supérieurs à .Pour répertorier les sous-répertoires immédiats contenant moins de
$NUM
fichiers.Les éléments sont terminés par un caractère nul
\0
, donc les noms de fichiers qui contiennent des sauts de ligne ou d'autres types d'espaces blancs seront interprétés correctement. Le%h
imprime chaque fichierdirname
.awk
utilise ensuite un tableau pour compter le nombre de fois qu'il rencontre chaque répertoire, en l'imprimant 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 aux fichiers normaux, pas aux liens, répertoires, sockets, blocs, canaux nommés, etc.
J'ai essayé de le faire aussi simplement que 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 tous les énumérer.
la source
Essaye ça:
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 devez vérifier plusieurs répertoires, utilisez simplement loop.
la source
.
), que vous souhaiterez peut-être modifier en conséquence.wc -l < <(printf %s\\n ./*)
ouprintf %s\\n ./* | wc -l
à l'intérieur du test, pour éviter unfind
appel inutile . Cela évitera également le problème que @terdon a noté, d'inclure.
dans le résultat. Cependant, cela poserait également le problème d'ignorer les fichiers commençant par un.
; Je résoudrais cela avecshopt -s dotglob
(pour que les globes correspondent aux fichiers commençant par un.
, mais pas.
ou..
).