Shell : compter le nombre de fichiers dans un dossier..compliqué

Fermé
Cloturernapasdesensfigure Messages postés 111 Date d'inscription vendredi 6 février 2015 Statut Membre Dernière intervention 22 juin 2016 - 20 juin 2016 à 17:08
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 - 22 juin 2016 à 16:06
Bonjour,


Voilà j'aimerais passer une commande, ou suite de commandes, ou faire un script pour compter le nombre de fichiers d'un dossier, et si le "ls" échoue, afficher une erreur. Je précise bien que je souhaite effectuer le ls et afficher une erreur s'il échoue, et non pas déterminer à l'avance si le ls va échouer.

Pour tester j'ai créé :
Un dossier nommé aa contenant un seul fichier nommé "h h"
Un dossier nommé bb ne contenant aucun fichier

J'utilise ls $dossier | wc -l pour connaitre le nombre de fichiers.

Problème : si "ls" échoue, le wc -l lancé en parallèle renvoie quand même 0.

GNU-bash-4.1.2 $ ls
aa bb
GNU-bash-4.1.2 $ ls aa |wc -l
1
GNU-bash-4.1.2 $ ls bb |wc -l
0
GNU-bash-4.1.2 $ ls cc | wc -l
ls: impossible d'accéder à cc: Aucun fichier ou dossier de ce type
0
GNU-bash-4.1.2 $


J'ai essayé de stocker le résultat du "ls" dans une variable, mais dans ce cas je perds le dernier saut de ligne du résultat du "ls", et le wc -l donne un mauvais résultat.

Avez-vous une meilleure idée ? Comment feriez-vous pour solutionner ce problème ?
Merci :)
A voir également:

5 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
20 juin 2016 à 17:55
Salut,

Peut-être pas la solution la plus optimisée :

ls cc >/dev/null && ls cc  | wc -l

0
Cloturernapasdesensfigure Messages postés 111 Date d'inscription vendredi 6 février 2015 Statut Membre Dernière intervention 22 juin 2016 5
20 juin 2016 à 18:10
:)
J'y avais songé à un moment mais sans tester puisque ça fait faire 2 fois le ls et je n'aimais pas ça
Mais je suis forcé d'en reconnaître l'efficacité

GNU-bash-4.1.2 $ ls aa>/dev/null && ls aa | wc -l || echo ERREUR
1
GNU-bash-4.1.2 $ ls bb>/dev/null && ls bb | wc -l || echo ERREUR
0
GNU-bash-4.1.2 $ ls cc>/dev/null && ls cc | wc -l || echo ERREUR
ls: impossible d'accéder à cc: Aucun fichier ou dossier de ce type
ERREUR
GNU-bash-4.1.2 $


Je prends !
Merci !

(Je vais essayer de l'adapter aussi avec un find pour compter réellement le nombre de fichier y compris d'éventuels fichiers avec un "\n" dans le nom. S'il n'y a pas d'autre commande plus simple dédiée à celà)
0
Cloturernapasdesensfigure Messages postés 111 Date d'inscription vendredi 6 février 2015 Statut Membre Dernière intervention 22 juin 2016 5
20 juin 2016 à 19:56
Rebonjour,
J'aimerais quand même trouver une solution propre.

Je n'y arrive pas.
J'ai essayé de bien des façons, sans succès, voici ma dernière tentative (affreuse) :
if liste="$(find aa -type f -print0)"; then od -c <<<"$liste" | fgrep -o '\0' |wc -l; else echo "ERREUR"; fi

Je crois pourtant essayer de faire quelque chose de simple, non ? Compter proprement le nombre de fichiers d'un dossier.
Voyez-vous une autre manière de faire svp ?

Mes difficultés :
- passer par une variable temporaire supprime l'information du dernier saut de ligne et tous les caractères binaires NULL.
(J'aimerais ne pas avoir à créer de fichiers temporaires juste pour ça)
- mettre des commandes entre "|" dans une commande entre $( ) fait que je n'arrive pas à savoir s'il y a eu une erreur à l'exécution de la première commande, même avec $PIPESTATUS.
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
22 juin 2016 à 02:13
Bonjour,

find /chemin/ -type f est pour des fichiers utilise -type d pour les répertoirs
0
karirovax Messages postés 3221 Date d'inscription dimanche 17 janvier 2010 Statut Membre Dernière intervention 22 juin 2016 203
22 juin 2016 à 02:18
exemple pour le répertoire courant si on veux s'avoir combien de répertoire:

find . -type d -name "*" | wc -l
0