Rsyncing de files avec des caractères spéciaux sur USB FAT32

Je veux copyr un grand nombre de files sur un lecteur USB qui est formaté FAT32 (et ne peut pas être formaté autre chose, malheureusement).

Beaucoup de ces files ont des noms avec des caractères tels que : et ? que FAT32 ne permet pas. En essayant d'utiliser cp ou rsync , ces files ne sont pas copiés et une erreur est signalée.

Je ne veux pas renommer les files à la source, mais je ne me soucie pas non plus de ce que les files sont renommés sur le lecteur USB de destination.

Clarification sur le but (s'applique également aux autres commentaires): Ceci est pour un lecteur mp3 dans une voiture et le logiciel ne permet FAT32. Donc, ce n'est pas à des fins de sauvegarde. Et les raisons pour lesquelles les noms de files ont des caractères étranges sont parce qu'ils sont, par exemple, des titres de mp3 ou des noms d'artistes.

J'ai essayé quelques choses:

  1. L'option --iconv de rsync. Cela n'a pas semblé fonctionner mais peut-être je ne l'ai pas utilisé correctement.
  2. rdiff-backup , que je lis fait cette conversion par défaut. Cependant, les files source sont des liens symboliques que je veux suivre (c'est-à-dire l'option -L de rsync), et à partir des pages de manuel, il ne semble pas que rdiff-backup ait cette option.

D'autres suggestions?

Rsync avec --iconv serait une option, mais vous auriez d'abord besoin de définir un encoding où ? , : et d'autres sont encodés avec des caractères autorisés sur les filesystems FAT.

Pour votre cas d'utilisation, vous n'utilisez pas toute la puissance de rsync pour cela. Cette tâche peut être effectuée dans quelques lignes de script shell.

Voici un script bash qui copy ~/Music vers /media/usb99 , en sautant les files qui sont plus anciens sur la cible, et convertit : et ? à _ . Il ne détecte pas les conflits (je suppose que vous n'avez pas les deux foo:bar.mp3 et foo?bar.mp3 ).

 #!/bin/bash set -e shopt -s dotglob globstar cd ~/Music for source in **/*; do target=/media/usb99/${source#"$HOME"/} target=${target//[:?]/_} if [[ -d $source ]]; then mkdir -p -- "$target" elif [[ $target -ot $source ]]; then cp -p -- "$source" "$target" fi done 

Ce script fonctionne sous zsh avec des modifications mineures: remplacez shopt -s dotglob globstar par setopt dot_glob et [[ $target -ot $source ]] par [[ ! -e $target || $target -ot $source ]] [[ ! -e $target || $target -ot $source ]] [[ ! -e $target || $target -ot $source ]] .

Si c'est à des fins de sauvegarde, il suffit de ranger une archive tar. Aucun nom de file ne vous dérange de cette façon.