find -L . -type f | parallel -j 30 rsync -a {} /DESTINATION_EFS_FILESYSTEM
Une méthode pour ne pas rsync des fichiers qui ont été déplacés dans la source
Et en commentaire une extension à la solution qui m'a l'air pas mal du tout
I use a derivative of this method, by creating a separate hard-links directory with md5-filenames. This gets rid of any duplicate files as well. Any files in this hard links directory with link count 1 are removed. Any files in the albums tree without the same inode to be found in the hard links tree are hard-linked into the hard links tree by using an MD5 of the file. Before I rsync I update the hard links dir, so when my wife decides to make a beautiful photobook and copies and moves lots of photos around, my ADSL doesn't get swamped when backing up my local photo store.
The same script also generates JPG files from Nikon image files (NEF).
This works both on FreeBSD/Linux/UNIX/etc as well as NTFS. Which is nice.
rsync -ai source/ dest/ | grep -vE '^.'
L'option -i ajoute des informations pour chaque fichier (voir man)
Ici on filtre tout ce qui commence par un point == les fichiers/dossier qui n'ont pas été transférés
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-r, --recursive recurse into directories
-l, --links copy symlinks as symlinks
-p, --perms preserve permissions
-t, --times preserve modification times
-g, --group preserve group
-o, --owner preserve owner (super-user only)
-D same as --devices --specials
--devices preserve device files (super-user only)
--specials preserve special files
Prenons un bash qui ouput sur sa sortie standard (stdout) et sur sa sortie d'erreur (stderr) :
echo good
echo bad >&2
echo vanish >&2
echo good!
Comment faire pour rediriger la sortie standard vers un fichier (ou /dev/null pour l'exemple) et filter la sortie d'erreur pour retirer la ligne "vanish" ?
Pour ça il faut utiliser un process substitution :
/root/test.bash 2> >(grep -v vanish >&2) >/dev/null
Bien pratique dans un crontab pour recevoir un peu moins de mail lorsqu'on a des "erreurs" acceptables (rsync vanished par exemple)
SHELL=/bin/bash
Pour en savoir plus sur les process substitution : http://tldp.org/LDP/abs/html/process-sub.html
Par défaut, lorsqu'on copie des fichiers avec rsync, celui-ci va tenter d'arranger les permissions de cette manière :
Prenons un fichier hello.world qui appartient à l'user foo(115) et au group foo(115)
Lorsque rsync va copier ce fichier sur le systeme distant, il ne va pas donner un owner égal à 115:115 sans vérifier que :
dans /etc/passwd que 115 correspond à l'user foo
dans /etc/group que 115 correspond bien au groupe foo
Si ça correspond, tout va bien, le owner donné est 115:115
Par contre, s'il n'y a pas de correspondance, rsync va tenter d'en trouver une en cherchant l'user et le group et en trouvant les id numérique qui vont bien.
Tout ça c'est très pratique la plupart du temps, mais dans certains cas, on n'en a pas besoin. (exemple : dupliquer un lvm d'une vm avec rsync)
L'option --numeric-ids est là pour ça : le owner des fichiers sera défini numériquement tel quel sans aucune vérification.
Pour faire du backup sans prendre trop d'espace (à la rsnapshot) on peut utiliser les hardlinks. Le truc cool, c'est que rsync est conscient de ces hardlinks et va créer un nouveau fichier si la destination est un hardlink et que le fichier a changé. Super pratique.
What most people don’t know is that rsync is an exception to this rule. If you use rsync to sync two files, and it sees that the target file is a hard link, it will create a new target file but only if the contents of the two files are not the same
"Trailing slash on the
destination directory doesn't matter."
Quand on fait un rsync, il faut juste se méfier du slash à la fin de la source (le comportement est différent, voir : http://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html#jveweb_en_014_02)
Sinon pour le slash à la fin de la destination, on s'en fout.
Pour comprendre un peu mieux certaines subtilités de rsync + compléter mémo
rsync -aPh --no-inc-recursive --exclude="lost+found" --del "/media/DATA/" "/media/SAUV_DATA/"
Courte explication: le paramètre « a » indique archive, fichiers et dossiers seront copiés à l’identique selon leur taille+date de modification. « P » indique reprise des transferts partiels et affichage de la progression. « h » indique affichage humain (conversion des tailles en kilo-octets, méga-octets,.. « –no-inc-recursive » indique que le comptage se fait avant le transfert, donc vous avez une indication précise de l’avancement (genre fichier 542/51641). « –exclude » exclut un fichier ou dossier selon ce mot clé, « lost+found » étant un dossier spécial crée sur les partitions Linux pour les fichiers récupérés en cas de crash. Ledit dossier étant protégé en écriture, rsync bute dessus (« i/o error ») et annule donc toute suppression de fichier sur le volume de destination (ce qui n’est pas bien, car) « del » indique à rsync de supprimer au fur et à mesure les fichiers de la destination s’ils ne sont plus dans la source, histoire d’avoir une copie exacte de tous les fichiers sur les deux volumes. La suite: « {source} » et « {destination} ». Voilà :)