Écrire script find.sh qui parcourt les repertoires et sous-repertoire
limbaon9
Messages postés
46
Statut
Membre
-
Cobalt222S Messages postés 7 Statut Membre -
Cobalt222S Messages postés 7 Statut Membre -
Bonjour tout le monde c'est encore moi ^^.
Bon cette fois ci je vous interpelle parce que je suis entrain de faire un script shell qui recherche les occurrences d’un fichier ou d’un répertoire à partir d’un répertoire donné en argument. Cette commande doit parcourir récursivement les sous-répertoire par appel au programme lui-même pour y effectuer une recherche complète. Elle affiche sur la sortie standard les chemins ou l’entrée est trouvée.Le programme retourne 0 (exit) en cas de succès 1 sinon find.sh [type] rep nom. Voila le résultat auquel on doit s'attendre :
>find.sh d /tmp r2
/tmp/src/r2
/tmp/src2/sr2/r2
>find.sh . f1
./f1./src/f1
./tmp/f1
>echo $?
0
>find.sh . fichierQuiNExitePas
>echo $?
1
Pour l'instant voila ce que j'ai fait et ça ne marche pas car ça m'affiche tous les répertoires et sous-répertoires du paramétrè entré pour find.sh :
et pour ma fonction find j'ai ce code (qui ne m'affiche rien au passage) :
et je dois faire la même question mais cette fois-ci avec une fonction. Je me permet de vous contacter parce que je trouve que vous etes les meilleurs et que presque toutes mes questions ont été résolues jusqu'ici.
Bon cette fois ci je vous interpelle parce que je suis entrain de faire un script shell qui recherche les occurrences d’un fichier ou d’un répertoire à partir d’un répertoire donné en argument. Cette commande doit parcourir récursivement les sous-répertoire par appel au programme lui-même pour y effectuer une recherche complète. Elle affiche sur la sortie standard les chemins ou l’entrée est trouvée.Le programme retourne 0 (exit) en cas de succès 1 sinon find.sh [type] rep nom. Voila le résultat auquel on doit s'attendre :
>find.sh d /tmp r2
/tmp/src/r2
/tmp/src2/sr2/r2
>find.sh . f1
./f1./src/f1
./tmp/f1
>echo $?
0
>find.sh . fichierQuiNExitePas
>echo $?
1
Pour l'instant voila ce que j'ai fait et ça ne marche pas car ça m'affiche tous les répertoires et sous-répertoires du paramétrè entré pour find.sh :
for file in "$1"*/ ; do
echo "$file"
done
et pour ma fonction find j'ai ce code (qui ne m'affiche rien au passage) :
find()
{
if [$# -lt 2]
then
echo "usage(): find [type] rep -name file"
exit 1
fi
fore file in "$1"/* ; do
if [ -d "$file" ] ; then
$0 "$file"
fi
echo "$file"
done
}
et je dois faire la même question mais cette fois-ci avec une fonction. Je me permet de vous contacter parce que je trouve que vous etes les meilleurs et que presque toutes mes questions ont été résolues jusqu'ici.
A voir également:
- Find_sh
- Script vidéo youtube - Guide
- Répertoire téléphonique gratuit - Télécharger - Bureautique
- Ecrire en gras sur whatsapp - Guide
- Application pour écrire les chiffre en lettre - Télécharger - Outils professionnels
- Comment écrire # sur pc - Guide
5 réponses
Salut,
J'avoue ne pas avoir bien saisi toute la finalité de ce que tu veux faire ;-(
Sans compter quelques petites erreurs ou méthodes pas très orthodoxes ;-\
Déjà, nommer une fonction avec le nom d'une commande existante c'est pas génial, d'autant plus que tu lui as donné presque la même façon de lui passer des ooptions, c'est déconcertant quand on lit ton code ;-\
À faire ce que tu veux, est-ce que l'appel de la commande
J'avoue ne pas avoir bien saisi toute la finalité de ce que tu veux faire ;-(
Sans compter quelques petites erreurs ou méthodes pas très orthodoxes ;-\
Déjà, nommer une fonction avec le nom d'une commande existante c'est pas génial, d'autant plus que tu lui as donné presque la même façon de lui passer des ooptions, c'est déconcertant quand on lit ton code ;-\
if [$# -lt 2]Il faut des espaces de part et d'autre des crochets
if [ $# -lt 2 ].
$0 "$file"Rappeler le script lui même, non plus n'est pas l'idéal, du moins pour la façon dont tu t'en sers ;-\
À faire ce que tu veux, est-ce que l'appel de la commande
find(la vraie, pas ta fonction) ne suffit pas en elle même pour ce que j'ai compris de ton besoin ?
Merci pour l'info sur les espaces dans les crochets. Et oui l'appel de la commande find pourrait bien suffir mais comme précisé sur le sujet c'est un script shell et une fonction qui recherche un fichier un répertoire à partir d’un répertoire donné en argument et tout ça avec un find. Et à la fin je dois m'attendre à un résultat du genre :
>find.sh . f1
./f1./src/f1
./tmp/f1
>echo $?
0
>find.sh . fichierQuiNExitePas
>echo $?
1
Peut être que j'ai pas été clair sur la finalité de ce que doit faire ce script :-(
>find.sh . f1
./f1./src/f1
./tmp/f1
>echo $?
0
>find.sh . fichierQuiNExitePas
>echo $?
1
Peut être que j'ai pas été clair sur la finalité de ce que doit faire ce script :-(
et tout ça avec un findOn parle bien de la commande
/usr/bin/findlà ?
Donc ta fonction doit/peut appeler la commande
findet ce qui importe c'est les tests à faire avant concernant le nombre de paramètres d'une part et de l'autre déterminer si c'est un fichier qu'il faut chercher ou un fichier dans un répertoire précis. J'ai bon ?
Sachant aussi que pour appeler le scrpit on effectue la commande suivante :
source $0 $type (fichier ou répertoire) $repertoire $nom.
source $0 $type (fichier ou répertoire) $repertoire $nom.
salut,
cet exercice porte sur la récursivité.
àmha, il ne faut pas utiliser find qui est récursif par défaut (on peut la bloquer, mais alors quel intérêt ?), ni utiliser de fonction puisque la récursivité c'est le script qui doit s'appeler lui-même pour effectuer la récusivité.
on reprend :
le script reçoit 2 (chemin nomFic) ou 3 arguments (type (combien sont prédéfinis ?) chemin nomRep), sinon on sort avec une erreur.
en pseudo code:
si nbArg est inférieur à 2
alors quitter avec erreur
autrement
si nbArg vaut 2
alors
chemin vaut premier argument
nomFic vaut deuxième argument
pour fichierOuRepertoire dans chemin
si fichierOuRepertoire est un fichier ET fichierOuRepertoire vaut chemin/nomFic
alors afficher fichierOuRepertoire
autrement
si fichierOuRepertoire est un repertoire
alors exécuter script avec fichierOuRepertoire nomFic
finSi
autrement (nbArg vaut 3)
pour repertoire dans chemin (en bash on peut limiter chemin aux seuls répertoire)
si repertoire vaut chemin/nomRep
alors
afficher repertoire
exécuter script type repertoire nomRep
finSI
finSI
ce n'est pas ni vérifier, ni tester : il y a longtemps que je n'ai pas fait de récursivité. :(
cet exercice porte sur la récursivité.
àmha, il ne faut pas utiliser find qui est récursif par défaut (on peut la bloquer, mais alors quel intérêt ?), ni utiliser de fonction puisque la récursivité c'est le script qui doit s'appeler lui-même pour effectuer la récusivité.
on reprend :
le script reçoit 2 (chemin nomFic) ou 3 arguments (type (combien sont prédéfinis ?) chemin nomRep), sinon on sort avec une erreur.
en pseudo code:
si nbArg est inférieur à 2
alors quitter avec erreur
autrement
si nbArg vaut 2
alors
chemin vaut premier argument
nomFic vaut deuxième argument
pour fichierOuRepertoire dans chemin
si fichierOuRepertoire est un fichier ET fichierOuRepertoire vaut chemin/nomFic
alors afficher fichierOuRepertoire
autrement
si fichierOuRepertoire est un repertoire
alors exécuter script avec fichierOuRepertoire nomFic
finSi
autrement (nbArg vaut 3)
pour repertoire dans chemin (en bash on peut limiter chemin aux seuls répertoire)
si repertoire vaut chemin/nomRep
alors
afficher repertoire
exécuter script type repertoire nomRep
finSI
finSI
ce n'est pas ni vérifier, ni tester : il y a longtemps que je n'ai pas fait de récursivité. :(
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question