Script comparaison de contenu de dossier et choix de copier
goodsayan
Messages postés
61
Date d'inscription
Statut
Membre
Dernière intervention
-
goodsayan Messages postés 61 Date d'inscription Statut Membre Dernière intervention -
goodsayan Messages postés 61 Date d'inscription Statut Membre Dernière intervention -
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
Si quelqu'un peut m'aider? Ou peut etre existe t'il une autre facon plus simple?
Merci beaucoup
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:
- Linux comparer 2 répertoires
- Liste déroulante de choix excel - Guide
- Dossier appdata - Guide
- Impossible de supprimer un dossier - Guide
- Mettre un mot de passe sur un dossier - Guide
- Script vidéo youtube - Guide
4 réponses
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...
Je voudrais juste qu'il copie les fichiers manquants...
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.
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 $
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
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
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