Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/11/2016, à 22: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 ! smile

Dernière modification par Steemo (Le 06/11/2016, à 23:54)

Hors ligne

#2 Le 05/11/2016, à 22: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, à 01: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, à 01: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, à 02:13)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 06/11/2016, à 13: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, à 14: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, à 15:02)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 06/11/2016, à 22: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 wink

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, à 22:49)

Hors ligne

#8 Le 06/11/2016, à 23: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, à 23: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 wink

En tout cas merci beaucoup pour ton aide smile
Bonne soirée

Hors ligne