Quelle est la meilleure façon de synchroniser les files sur une partition VFAT?

Les noms de files POSIX peuvent contenir tous les caractères à l'exception de / , mais certains filesystems réservent des caractères comme ?<>\\:*|" . Avec pax , je peux copyr des files en remplaçant ces caractères réservés:

 $ pax -rw -s '/[?<>\\:*|\"]/_/gp' /source /target 

Mais pax n'a pas d'option --delete comme rsync et rsync ne peut pas replace les caractères. Je cherche un moyen simple de sauvegarder régulièrement ma collection de musique sur un disque dur externe.

Vous pouvez afficher le système de files FAT avec la sémantique POSIX, y compris les noms de file de support avec n'importe quel caractère autre que / ou un octet null. POSIXovl est un système de files FUSE relativement récent pour cela.

 mkdir backup-fat mount.posixovl -S /media/sdb1 backup-fat rsync -au /source backup-fat/target 

Les caractères dans les noms de files que VFAT n'accepte pas sont codés en tant que %(XX)XX sont des numbers hexadécimaux. À partir de POSIXovl 1.2.20120215, prenez garde à ce qu'un nom de file comme %(3A) soit codé en tant que lui-même et sera décodé comme suit : il y a donc un risque de collision si vous avez des noms de files contenant des sous-strings de la forme %(XX) .

Attention, POSIXovl ne gère pas les noms de files trop longs. Si le nom codé ne correspond pas à 255 caractères, le file ne peut pas être enregistré.

POSIXovl stocke les permissions unix et la propriété dans les files appelés .pxovl.FILENAME .

J'étais curieux à ce sujet et j'ai donc creusé un peu.

Il y a quelques correctifs pour faire ceci qui ne sont jamais entrés dans rsync, si vous avez envie de comstackr à partir de la source. Bien que les deux soient vieux, ils peuvent ne pas fonctionner encore. Celui-ci ajoute spécifiquement une option --fat-filenames et celle-ci pour une option --tr .

Ces questions couvrent également quelque chose de similaire – Rsyncing files avec des caractères spéciaux à USB FAT32 et https://askubuntu.com/questions/11634/how-can-i-substitute-colons-when-i-sync-on-a-usb- key . Le meilleur pari est probablement rdiff-backup qui effectue la substitution, mais je ne vois pas d'options pour en avoir le contrôle. Il y a aussi d'autres bonnes idées.

Une idée approximative pour un script qui supprimerait et recréerait les files à chaque fois, s'il n'y en a pas trop, serait quelque chose comme:

 [sudo] updatedb # doing this as root will update the system database locate -r '^/full/path/to/source/.*[?<>\\:*|\"]' | sed 's\^/full/path/to/source/\\' >bad_names rsync --delete --exclude-from=bad_names -av source/ target cd source <bad_names pax -rw -s '/[?<>\\:*|\"]/_/gp' target 

locate serait plus rapide que find si la database est raisonnablement à jour.

Enfin, vous pouvez simplement faire ceci pour que les files ne causent plus de problèmes (du less ceux qui existent déjà):

 find source/ -regex '[?<>\\:*|\"]' -exec rename 's/'[?<>\\:*|\"]'/_/g' {} + 

Je recommand d'essayer cela avec rename -n abord, mais au cas où quelque chose se passe mal.