Script comparaison de contenu de dossier et choix de copier

goodsayan Messages postés 62 Statut Membre -  
goodsayan Messages postés 62 Statut Membre -
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

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    rsync fait ça très bien et plus simplement ;-))
    0
  2. goodsayan Messages postés 62 Statut Membre 12
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. goodsayan Messages postés 62 Statut Membre 12
       
      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
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Avec rsync non ;-(
      0
    4. goodsayan Messages postés 62 Statut Membre 12
       
      Dommage...
      0
  3. goodsayan Messages postés 62 Statut Membre 12
     
    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
  4. goodsayan Messages postés 62 Statut Membre 12
     
    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