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

Fermé
limbaon9 Messages postés 42 Date d'inscription lundi 14 octobre 2019 Statut Membre Dernière intervention 12 mars 2022 - Modifié le 16 avril 2020 à 13:19
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020 - 7 mai 2020 à 11:20
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 avril 2020 à 17:02
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 ?

0
limbaon9 Messages postés 42 Date d'inscription lundi 14 octobre 2019 Statut Membre Dernière intervention 12 mars 2022
16 avril 2020 à 17:15
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 :-(
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 avril 2020 à 17:28
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 ?
0
limbaon9 Messages postés 42 Date d'inscription lundi 14 octobre 2019 Statut Membre Dernière intervention 12 mars 2022 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
16 avril 2020 à 20:18
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 ^^.
0
limbaon9 Messages postés 42 Date d'inscription lundi 14 octobre 2019 Statut Membre Dernière intervention 12 mars 2022
17 avril 2020 à 11:33
Sachant aussi que pour appeler le scrpit on effectue la commande suivante :
source $0 $type (fichier ou répertoire) $repertoire $nom.
0
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020
1 mai 2020 à 07:06
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é. :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loftyramitsu Messages postés 37 Date d'inscription vendredi 27 mars 2020 Statut Membre Dernière intervention 29 juin 2020 1
6 mai 2020 à 19:18
Et un petit grep qui prendrait les résultats du find et qui filtre les données ?
0
Cobalt222S Messages postés 7 Date d'inscription vendredi 14 décembre 2018 Statut Membre Dernière intervention 1 juin 2020
7 mai 2020 à 11:20
cet exercice porte sur la récursivité.
le résultat compte moins que la démonstration.
0