Écrire script find.sh qui parcourt les repertoires et sous-repertoire

[Fermé]
Signaler
Messages postés
36
Date d'inscription
lundi 14 octobre 2019
Statut
Membre
Dernière intervention
9 décembre 2020
-
Messages postés
7
Date d'inscription
vendredi 14 décembre 2018
Statut
Membre
Dernière intervention
1 juin 2020
-
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 :

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:

5 réponses

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 367
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 ;-\

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 ?

Messages postés
36
Date d'inscription
lundi 14 octobre 2019
Statut
Membre
Dernière intervention
9 décembre 2020

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 :-(
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 367
et tout ça avec un find
On parle bien de la commande
/usr/bin/find
là ?

Donc ta fonction doit/peut appeler la commande
find
et 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 ?
Messages postés
36
Date d'inscription
lundi 14 octobre 2019
Statut
Membre
Dernière intervention
9 décembre 2020
>
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021

Oui exactement ma fonction peut appeler la commande find et faut juste faire des tests sur les nombres d'arguments et si c'est un fichier ou un répertoire. Et désolé d'avoir répondu aussi tardivement ^^.
Messages postés
36
Date d'inscription
lundi 14 octobre 2019
Statut
Membre
Dernière intervention
9 décembre 2020

Sachant aussi que pour appeler le scrpit on effectue la commande suivante :
source $0 $type (fichier ou répertoire) $repertoire $nom.
Messages postés
7
Date d'inscription
vendredi 14 décembre 2018
Statut
Membre
Dernière intervention
1 juin 2020

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é. :(
Messages postés
37
Date d'inscription
vendredi 27 mars 2020
Statut
Membre
Dernière intervention
29 juin 2020
1
Et un petit grep qui prendrait les résultats du find et qui filtre les données ?
Messages postés
7
Date d'inscription
vendredi 14 décembre 2018
Statut
Membre
Dernière intervention
1 juin 2020

cet exercice porte sur la récursivité.
le résultat compte moins que la démonstration.