#1 Le 05/11/2016, à 21:14
- Steemo
[Résolu] Script de débutant
Bonsoir,
Je dois faire un script shell, mais je dois vous dire qu'après 2h de recherche intensif, je n'arrive pas à le faire. C'est pour ceci que je poste ce message, si quelqu'un d'expérimenté en shell peut m'aider ça serait avec plaisir !
Voici l'énoncé:
écrire un script qui, étant donnés deux dossiers données en paramètres, affichera les chemins des fichiers apparaissant dans l'arborescence dont le premier ($1) est la racine mais pas dans l'arborescence dont le deuxième ($2) est la racine.
Par exemple, si le premier dossier est ainsi (affichage à la tree, f des fichiers, d des dossiers) :
d1
|__ d3
| |__ f1
|__ d4
|__ d5
| |__ f2
|__ f1
Et le deuxième :
d2
|__ d3
|__ d5
| |__ f2
|__ f1
Il faut afficher :
d3/f1
d4
Voilà, en vous remerciant d'avance, bonne soirée !
Dernière modification par Steemo (Le 06/11/2016, à 22:54)
Hors ligne
#2 Le 05/11/2016, à 21:24
- cqfd93
Re : [Résolu] Script de débutant
Bonsoir,
Et si tu commençais par montrer ce que tu as déjà fait, même si ça ne marche pas ? Parce que c'est trop facile de donner l'énoncé de l'exercice et d'attendre que la solution te tombe toute cuite…
− cqfd93 −
Hors ligne
#3 Le 06/11/2016, à 00:45
- Steemo
Re : [Résolu] Script de débutant
Bonsoir,
Tout d'abord merci de ta réponse.
En effet, j'aurai dû vous montrer mes recherches, mais étant un débutant je ne pense pas que ça peut vous être utile.
Voici donc quand même ce que j'ai fais, je suis bloqué à ce niveau:
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Erreur : Il faut 2 dossier en argument"
exit
fi
if [ -d $1 ]; then
find $1
else
echo "$1 n'est pas present"
fi
if [ -d $2 ]; then
find $2
else
echo "$2 n'est pas present"
fi
Je continue de chercher de mon côté, merci
Bonne soirée
Hors ligne
#4 Le 06/11/2016, à 00:55
- Watael
Re : [Résolu] Script de débutant
salut,
est-il réellement question de rédiger un script bash, ou d'utiliser les commandes disponibles via le terminal pour accomplir la tâche ?
dans la deuxième optique :
renseigne-toi sur la commande comm (man comm) , et sur la substitution de processus dans le man bash pour y placer ton find.
et éventuellement sur la commande sort.
Dernière modification par Watael (Le 06/11/2016, à 01:13)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 06/11/2016, à 12:52
- Steemo
Re : [Résolu] Script de débutant
Bonjour,
Malheureusement oui, il est bien question de rédiger un script bash.
J'ai essayé d'introduire dans mon script la commande comm mais cette commande compare ligne par ligne deux fichiers. Mais lorsque je fais un find du premier argument et du deuxième, la commande comm prend en compte l'ordre chose que je ne veux pas puisque ça ne pourra pas être dans le bon ordre.
Je viens de trouver la commande diff, je l'ai introduis dans mon script: diff (premier dossier) (deuxième dossier) -r.
Cela m'affiche ceci:
Seulement dans d1/d3: f1
Seulement dans d1: d4
Je suis pas loin du résultat qui doit être je le rappelle:
d3/f1
d4
Je continue de chercher de mon côté, en tout cas merci pour votre aide !
Bonne journée
Hors ligne
#6 Le 06/11/2016, à 13:38
- Watael
Re : [Résolu] Script de débutant
tu as oublié de lire la partie du man bash concernant la substitution de processus dont la sortie est un descripteur de fichier, et donc, en quelque sorte, un fichier.
comm va comparer, ligne par ligne, les sorties triées (sort) du contenu de chaque répertoire formaté par find avec son option/action printf,
et afficher uniquement la première colonne (ou ne pas afficher les deux autres).
$ tree --noreport d1 d2
d1
├── d3
│ └── f1
├── d4
├── d5
│ └── f2
└── f1
d2
├── d3
├── d5
│ └── f2
└── f1
$
$ maFonctionMystere d1 d2
d3/f1
d4
$
Dernière modification par Watael (Le 06/11/2016, à 14:02)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 06/11/2016, à 21:48
- Steemo
Re : [Résolu] Script de débutant
Bonsoir,
Oui tu as raison, après comme je l'ai dis je suis un débutant, je connais très peu de commande. J'ai donc cherché grâce à tes pistes, voici mon résultat:
comm -3 <(sort ResultatDuFind) <(sort ResultatDuFind2)
J'ai donc essayé de chercher comment mettre le résultat de mon find, a part dans un fichier temporaire je ne vois pas comment.
Autre difficulté il faut transformé par exemple ceci "d1/d5/f1" en "d5/f1" pour être conforme à l'affichage demandé.
Etant donné que je dois le rendre ce soir, grâce à toutes mes recherches et à ton aide (malgré des choses que je comprends pas), voici le script qui à l'air de fonctionner mais qui n'est pas du tout optimisé:
#!/bin/bash
#Petite vérification
if [ $# -ne 2 ]; then
echo "Erreur : Il faut 2 dossier en argument"
exit
fi
#On écrit l'aborescense du dossier en enlevant le dossier lui même (ex: d1/d5/f1 > /d5/f1)
file1="$1.$$"
for i in `find ${1} | sed 1d` ; do echo "${i#${1}}" >> temp1 ; done
file2="$2.$$sf"
for i in `find ${2} | sed 1d` ; do echo "${i#${2}}" >> temp2 ; done
#On enleve le / à chaque début de ligne
cat temp1 | sed 's/\///' > temp3
cat temp2 | sed 's/\///' > temp4
#On les compare
comm -3 <(sort temp3) <(sort temp4)
#On supprime les fichiers temporaire
rm temp1
rm temp2
rm temp3
rm temp4
Donc voilà, je vais rendre ça, tant pis
En tout cas, merci beaucoup de m'avoir aidé, c'est super sympa !
Bonne soirée
Dernière modification par Steemo (Le 06/11/2016, à 21:49)
Hors ligne
#8 Le 06/11/2016, à 22:28
- Watael
Re : [Résolu] Script de débutant
ah, dommage, tellement près !
comm -23 <(find d1 -printf '%P\n' | sort) <(find d2 -printf '%P\n' | sort)
d3/f1
d4
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 06/11/2016, à 22:53
- Steemo
Re : [Résolu] Script de débutant
Oui c'est vrai que je me suis compliqué la vie ! Mais je pense que c'est ok puisque j'ai envoyé avec comm -23 car je me suis rendu compte de mon erreur en faisant plusieurs tests
En tout cas merci beaucoup pour ton aide
Bonne soirée
Hors ligne