Je veux trouver un sous-répertoire du répertoire courant, qui (c'est-à-dire le sous-répertoire) contient 2 fichiers réguliers ou plus.
Je ne suis pas intéressé par les répertoires contenant moins de 2 fichiers, ni par les répertoires qui ne contiennent que des sous-répertoires.
find
. Dans ce cas, parce que GNUfind
va modifier les noms des répertoires qui ont des caractères qui ne sont pas imprimables dans les paramètres régionaux actuels (comme "ä" dans les paramètres régionaux C). Voir aussi unix.stackexchange.com/questions/321697/…-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
Cela trouvera tous les noms dans ou sous le répertoire courant, puis filtrera tous les noms qui ne sont pas des noms de répertoires.
Les noms de répertoire restants seront donnés à ce court script:
Ce script comptera le nombre de fichiers normaux (en sautant les liens symboliques) dans le répertoire donné comme premier argument de ligne de commande (à partir de
find
). La dernière commande du script est un test pour voir si le nombre était de 2 ou plus. Le résultat de ce test est la valeur de retour (état de sortie) du script.Si le test a réussi,
-print
entraînera l'find
impression du chemin d'accès au répertoire.Pour également considérer les fichiers cachés (fichiers dont les noms commencent par un point), changez le
sh -c
script de direà
Essai:
la source
[ "" -ge 2 ]
c'est un test valide.dash
,bash --posix
ettest
tous affichent un message d'erreur et quittent avec 2 (c.-à-d. "Une erreur s'est produite")ksh
fonctionnant sous le nom de massh
. Se modifiera immédiatement. Merci de m'avoir piqué! :-)[ -f ... ]
déréférence les liens symboliques. Vous devez ajouter un test pour les éliminer car la question spécifie que seuls les fichiers normaux doivent être comptés.Avec l'aide de la réponse de Gilles sur SU et son revers et quelques modifications, voici ce dont vous avez besoin.
Arborescence de répertoires.
Résultat:
la source
test
et lesdir2
répertoires dans ma configuration de test (voir ma réponse).test/x1
et entest/x2
tant que fichiers également ...$1
et$2
seront des répertoires pourtest
, et le répertoire sera manqué.Une autre approche
find
+wc
:path/currdir
- chemin vers votre répertoire actuel-maxdepth 1
- ne considérer que les sous-dossiers enfants directs! -empty
- ignorer les sous-dossiers vides! -path "path/currdir"
- ignorer le chemin du répertoire courantcount=$(find "$1" -maxdepth 1 -type f | wc -l)
-count
est attribué avec le nombre de fichiers pour chaque sous-dossier trouvé[ $count -ge 2 ] ... -print
- imprimer le nom / chemin du sous-dossier contenant 2 fichiers réguliers ou plusla source