Shell : compter le nombre de fichiers dans un dossier..compliqué
Cloturernapasdesensfigure
Messages postés
111
Date d'inscription
Statut
Membre
Dernière intervention
-
UnGnU Messages postés 1158 Date d'inscription Statut Contributeur Dernière intervention -
UnGnU Messages postés 1158 Date d'inscription Statut Contributeur Dernière intervention -
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.
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 :)
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:
- Écrire un programme count_files.sh qui affiche le nombre de fichiers réguliers et de répertoires dans le répertoire courant.
- Classic shell - Télécharger - Personnalisation
- Classic shell c'est quoi ✓ - Forum Windows 10
- Classic shell est il sain? ✓ - Forum Windows 8 / 8.1
- Classic shell ✓ - Forum Windows 10
- Shell addition ✓ - Forum Shell
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é
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à)
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.
find /chemin/ -type f est pour des fichiers utilise -type d pour les répertoirs
find . -type d -name "*" | wc -l