Script comparaison de contenu de dossier et choix de copier

Fermé
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 - Modifié par goodsayan le 22/04/2013 à 12:25
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 - 22 avril 2013 à 17:28
Bonjour,

J'essaye de faire un script bash pour comparer 2 dossiers nommés DISTANT et LOCAL, afficher la différence de contenu et proposer de copier les fichiers manquants.

J'ai cherché des exemples sur le net mais je bloque...
J'arrive a comparer les fichiers et à afficher la différence de contenu dans un fichier file3
Chaque ligne de ce fichier contient les nom de fichiers manquants.

Ensuite je pensais compter le nombre de ligne de file3, utiliser la commande sed pour chaque ligne afin d'avoir le nom du contenu manquant et faire une copie en utilisant le nom obtenu.
Sauf que la commande sed ne fonctionne pas en mettant une variable.

Je vous met le code que j'utilise
#!/bin/sh 

DISTANT="/home/jc/Bureau/Test1" 
LOCAL="/home/jc/Bureau/Test2" 
file1="/tmp/compDossier1" 
file2="/tmp/compDossier2" 
file3="/tmp/compDossier3" 

#afficher les dossiers Distant et Local 
echo "le dossier distant est: \"$DISTANT\"" 
echo "le dossier local est: \"$LOCAL\"" 

#ajouter le cas échéant un "/" final aux noms de dossier 
[ -z "$(echo "$DISTANT"|grep "/$")" ] && DISTANT="$DISTANT/" 
[ -z "$(echo "$LOCAL"|grep "/$")" ] && LOCAL="$LOCAL/" 

#remplacer "/" par "\/" (pour le sed) 
DISTANTm=$(echo "$DISTANT"|sed "s#/#\\\/#g") 
LOCALm=$(echo "$LOCAL"|sed "s#/#\\\/#g") 

#lister les 2 dossiers 
find "$DISTANT" | sed "s/^$DISTANTm//" | sort >$file1 
find "$LOCAL" | sed "s/^$LOCALm//" | sort >$file2 

#Afficher les fichiers différents 
comm -12 $file1 $file2 | sort >$file3 

#nombre de lignes 
cat $file3 | wc -l 
Line="$(cat)" 
echo "Line" 

#recupération nom de fichier par ligne (par exemple la dernière ligne du fichier )
sed -n "${Line}p" ~/file3


rm $file1 $file2 $file3


Si quelqu'un peut m'aider? Ou peut etre existe t'il une autre facon plus simple?
Merci beaucoup

A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
22 avril 2013 à 13:15
Salut,

rsync fait ça très bien et plus simplement ;-))
0
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 12
Modifié par goodsayan le 22/04/2013 à 14:24
J'étais parti au début avec "mirror"et j'ai le meme probleme avec "rsync". Il copie des fichiers de noms identiques mais qui ont des dates de modification différentes...

Je voudrais juste qu'il copie les fichiers manquants...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
22 avril 2013 à 16:04
Apparemment en utilisant l'option "--ignore-existing" de rsync ça le ferait...

Dans repB le fichier "asc" est manquant et le fichier "plop" est différent.

$ ls -l repA/
total 24
-rw-r--r-- 1 jp jp   33 avril 22 15:14 asc
-rw-r--r-- 1 jp jp 6308 avril 22 09:45 docu
-rw-r--r-- 1 jp jp   44 avril 22 15:16 oct
-rw-r--r-- 1 jp jp  276 avril 22 15:39 plop
-rw-r--r-- 1 jp jp  226 avril 22 15:40 script.sed

$ ls -l repB/
total 20
-rw-r--r-- 1 jp jp 6308 avril 22 09:45 docu
-rw-r--r-- 1 jp jp   44 avril 22 15:16 oct
-rw-r--r-- 1 jp jp  236 avril 22 15:58 plop
-rw-r--r-- 1 jp jp  226 avril 22 15:40 script.sed

$ rsync -av --ignore-existing repA/ repB/
sending incremental file list
./
asc

sent 187 bytes  received 34 bytes  442.00 bytes/sec
total size is 6887  speedup is 31.16

$ ls -l repB/
total 24
-rw-r--r-- 1 jp jp   33 avril 22 15:14 asc
-rw-r--r-- 1 jp jp 6308 avril 22 09:45 docu
-rw-r--r-- 1 jp jp   44 avril 22 15:16 oct
-rw-r--r-- 1 jp jp  236 avril 22 15:58 plop    # Aucune modif
-rw-r--r-- 1 jp jp  226 avril 22 15:40 script.sed

$
0
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 12
Modifié par goodsayan le 22/04/2013 à 16:28
Merci! Y a t'il un moyen de faire ca étape par étape avec un choix de l'utilisateur?
Par exemple, j'aimerais qu'avant de copier le fichier "asc" il demande une confirmation a l'utilisateur? Et pareil à chaque fois qu'il y a un fichier nouveau
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
22 avril 2013 à 16:49
Avec rsync non ;-(
0
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 12
22 avril 2013 à 17:28
Dommage...
0
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 12
Modifié par goodsayan le 22/04/2013 à 16:46
J'avance un peu sans Rsync... Ca fonctionne presque! J'ai juste un soucis si le nom du fichier contient des espaces. Comment faire? (EDIT Résolu avec les double quote sur le nom de fichier)

#!/bin/sh

DISTANT="/home/jc/Bureau/Test1/"
LOCAL="/home/jc/Bureau/Test2"
file1="/tmp/compDossier1"
file2="/tmp/compDossier2"
file3="/tmp/compDossier3"

#afficher les dossiers Distant et Local
echo "le dossier distant est: \"$DISTANT\""
echo "le dossier local est: \"$LOCAL\""

#ajouter le cas échéant un "/" final aux noms de dossier
[ -z "$(echo "$DISTANT"|grep "/$")" ] && DISTANT="$DISTANT/"
[ -z "$(echo "$LOCAL"|grep "/$")" ] && LOCAL="$LOCAL/"

#remplacer "/" par "\/" (pour le sed)
DISTANTm=$(echo "$DISTANT"|sed "s#/#\\\/#g")
LOCALm=$(echo "$LOCAL"|sed "s#/#\\\/#g")

#lister les 2 dossiers
find "$DISTANT" | sed "s/^$DISTANTm//" | sort >$file1
find "$LOCAL" | sed "s/^$LOCALm//" | sort >$file2

#Afficher les fichiers différents
comm -3	$file1 $file2 > $file3
echo --------------------
cat $file3
echo --------------------

#nombre de lignes
a=$(cat $file3 | wc -l)

#recuperation des noms de fichiers de file3
for (( i=1; i <=a; i++ ))
do
Nom=$(sed -n "${i}p" $file3)
echo -n "Voulez vous copier le fichier "$Nom"? (o/n): "
read reponse
if [ "$reponse" = o ] || [ "$reponse" = O ] || [ "$reponse" = oui ] || [ "$reponse" = OUI ] ; then
cd $DISTANT
cp -r "$Nom" $LOCAL
fi
done


rm $file1 $file2 $file3
0
goodsayan Messages postés 61 Date d'inscription mardi 15 février 2005 Statut Membre Dernière intervention 8 décembre 2014 12
Modifié par goodsayan le 22/04/2013 à 17:30
Ca marche maintenant comme je veux.
Par contre le répertoire DISTANT est sur un serveur SFTP.
J'arrive à me connecter avec la commande suivante:
lftp sftp://XXXX:XXXX@IP:PORT -e "mirror /downloads /media/freebox/Téléchargements; quit"

Comment puis je adapter ce script pour que cela marche?

Merci
0