Je souhaite copier un grand nombre de fichiers sur un lecteur USB formaté en FAT32 (et ne peut malheureusement pas être formaté autrement).
Beaucoup de ces fichiers ont des noms avec des caractères tels que :
et ?
que FAT32 n'autorise pas. Si vous essayez d'utiliser cp
ou rsync
, ces fichiers ne sont pas copiés et une erreur est signalée.
Je ne veux pas renommer les fichiers à la source, mais je me fiche également de savoir comment les fichiers sont renommés sur le lecteur USB de destination.
Précision sur le but (s'applique également aux autres commentaires): c'est pour un lecteur mp3 dans une voiture et le logiciel n'autorise que le FAT32. Ce n'est donc pas à des fins de sauvegarde. Et la raison pour laquelle les noms de fichiers ont des caractères étranges est qu'ils sont, par exemple, des titres de mp3 ou des noms d'artistes.
J'ai essayé deux ou trois choses:
- L'
--iconv
option de rsync . Cela ne semblait pas fonctionner mais je ne l'ai peut-être pas utilisé correctement. rdiff-backup
, que j'ai lu fait cette conversion par défaut. Cependant, les fichiers source sont des liens symboliques que je veux suivre (c'est-à-dire l'-L
option de rsync ), et à partir des pages de manuel, il ne semble pas avoirrdiff-backup
cette option.
D'autres suggestions?
rsync
l'--iconv
option n'est pas faite pour ce que vous essayez de l'utiliser.--iconv
effectue des conversions de jeux de caractères, par exemple latin1 <-> utf8. Pas ce que vous cherchez.Réponses:
Rsync avec
--iconv
serait une option, mais vous devez d'abord définir un encodage où?
,:
et d'autres sont encodés avec des caractères autorisés sur les systèmes de fichiers FAT.Pour votre cas d'utilisation, vous n'utilisez pas toute la puissance de rsync pour cela. Cette tâche peut être effectuée en quelques lignes de script shell.
Voici un script bash qui copie
~/Music
vers/media/usb99
, en ignorant les fichiers plus anciens sur la cible, et convertit:
et?
vers_
. Il ne détecte pas les conflits (je suppose que vous n'avez pas les deuxfoo:bar.mp3
etfoo?bar.mp3
).Ce script fonctionne sous zsh avec des modifications mineures: remplacez
shopt -s dotglob globstar
parsetopt dot_glob
et[[ $target -ot $source ]]
par[[ ! -e $target || $target -ot $source ]]
.la source
Si c'est à des fins de sauvegarde, cachez simplement une archive tar. Aucun problème de nom de fichier de cette façon.
la source