Forum Linux.général rsync et chemin absolu.

Posté par . Licence CC by-sa
Tags : aucun
1
4
oct.
2014

Salut.

Je n'arrive pas à indiquer à rsync d'utiliser des chemins absolus. Je voudrais lancer (en tant que root) un script (localisé là : "/root/script/backup/backup.sh") qui contiendrait essentiellement la commande :

rsync -aP -vv --delete /home/mainuser /dev/usb0 --exclude-from="/root/script/backup/files_to_exclude.txt"

files_to_exclude.txt contenant entre autre :
/home/mainuser/Téléchargements

L'option exclude foncfionne très bien quand on la lance en ligne de commande depuis un répertoire local concerné, mais là elle n'en tient pas compte.

Des avis ? Merci.

  • # que c'est bizarre

    Posté par . Évalué à 3.

    1°) on sauvegarde rarement vers le peripherique en lui meme (/dev/usb0 dans ton cas)
    on sauvegarde plutot vers le point de montage de ce peripherique (/media/user/macleUSB ou /mnt/macleUSB)

    rsync -aP -vv --delete /home/mainuser /mnt/macleUSB --exclude-from="/root/script/backup/files_to_exclude.txt"

    2°) on met generalement toutes les options avant les SRC (/home/mainuser) et DST (/mnt/macleUSB)

    rsync -aP -vv --delete --exclude-from="/root/script/backup/files_to_exclude.txt" /home/mainuser /mnt/macleUSB
    • [^] # Re: que c'est bizarre

      Posté par . Évalué à 1.

      OK pour les deux remarques, bien sûr, mais c'était juste un brouillon très vite fait. De toute façon dans mon vrai script (plus complet) je ferai un minimum de contrôle de la clé USB avant de lancer la copie, mais ça n'est pas vraiment ce qui me préoccupe ici.

      Je serais assez surpris qu'il n'y ait pas de moyen d'indiquer des chemins absolus à rsync.

      • [^] # Re: que c'est bizarre

        Posté par . Évalué à 2.

        Je serais assez surpris qu'il n'y ait pas de moyen d'indiquer des chemins absolus à rsync.

        clairement
        par contre il est possible que le fait de mettre "/ton/chemin/absolu"
        entre ", fasse que le shell le gere bien mais le script le considere comme une chaine de caractere et non plus comme un chemin.

        vu qu'il n'y a pas d'espace ou de caractere speciaux tu peux essayer

        --exclude-from=/chemin/vers/fichier/exclusion
        • [^] # Re: que c'est bizarre

          Posté par . Évalué à 1.

          J'ai essayé et ça ne fonctionne toujours pas.
          Dans mon vrai script je sauve /root, /etc et /home/mainuser
          Mais je ne veux pas sauver des caches, des poubelles, des "tmp", etc ; explicitement nommés par leur chemins absolus.
          Il faut peut-être faire des "cd <répertoire source à copier>" avant, pour chaque répertoire.

          • [^] # Re: que c'est bizarre

            Posté par . Évalué à 2.

            Il faut peut-être faire des "cd " avant, pour chaque répertoire.

            ce serait moche

            par contre essayer en modifiant ton backup.sh en :

            # entrons dans le dossier qui contient le script de backup et la liste des exclusions
            cd /root/script/backup
            # lancons rsync en prenant l'exclusion à partir du fichier qui se trouve dans le dossier local
            rsync -aP -vv --delete-ad ---exclude-from=./files_to_exclude.txt /home/mainuser /mnt/maclefUSB
            # retournons dans le dossier ou nous etions precedemment
            cd -
  • # Mauvaise utilisation

    Posté par . Évalué à 8.

    files_to_exclude.txt contenant entre autre :
    /home/mainuser/Téléchargements

    Ton fichier d'exclusion contient des motifs (pattern) et tout motif d'exclusion global est relatif au dossier de sauvegarde.
    Dans ton cas rsync va donc chercher à exclure /home/mainsuser/home/mainsuser/Téléchargements

    Il faut que tu regardes la page de manuel de rsync, notamment la partie « INCLUDE/EXCLUDE PATTERN RULES ».

    Donc soit tu utilise juste « Téléchargement » dans ton fichier d'exclusions, soit tu invoques rsync avec l'option --relative

  • # Synthèse

    Posté par . Évalué à 3.

    OK, effectivement voilà ce qui fonctionne. Je mets ça ici.
    Un script "/home/mainuser/back/backup.sh" pour tester tout ça.

    #!/bin/sh
    
    rm -r /tmp/dest /tmp/source 2>/dev/null
    mkdir /tmp/source /tmp/dest
    touch /tmp/source/a /tmp/source/b
    
    exclude_file="/home/mainuser/back/not_to_save.txt"
    echo "a" > $exclude_file
    
    rsync -aPv --delete --exclude-from=$exclude_file /tmp/source/* /tmp/dest
    
    echo "------------------------------"
    echo "\"$exclude_file\" contient :"
    cat $exclude_file
    echo "------------------------------"
    echo "La source :"
    tree /tmp/source
    echo "------------------------------"
    echo "La destination :"
    tree /tmp/dest

    Et j'obtiens bien ce qui était attendu (en le lançant sans me soucier de savoir d'où).

    mainuser@station1:~/back$ ./backup.sh 
    sending incremental file list
    b
               0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)
    
    sent 86 bytes  received 31 bytes  234.00 bytes/sec
    total size is 0  speedup is 0.00
    ------------------------------
    "/home/mainuser/back/not_to_save.txt" contient :
    a
    ------------------------------
    La source :
    /tmp/source
    ├── a
    └── b
    
    0 directories, 2 files
    ------------------------------
    La destination :
    /tmp/dest
    └── b
    
    0 directories, 1 file
    

    J'ai tendance à aimer indiquer les chemins absolus parce que je les trouve très lisibles. Enfin c'est un détail, ça fonctionne bien. Par parenthèse "rsync" est vraiment un très bon utilitaire… une fois qu'on le maîtrise bien. ;) Moins "bourrin" que "cp" pour faire des sauvegardes et rend souvent inutile beaucoup d'interfaces graphiques.

    Merci à vous.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.