Rsynchronisation de fichiers avec des caractères spéciaux vers USB FAT32


8

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 cpou 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:

  1. L' --iconvoption de rsync . Cela ne semblait pas fonctionner mais je ne l'ai peut-être pas utilisé correctement.
  2. 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' -Loption de rsync ), et à partir des pages de manuel, il ne semble pas avoir rdiff-backupcette option.

D'autres suggestions?


Tout d'abord, pourquoi ne pouvez-vous pas reformater la clé USB et pourquoi avez-vous des noms de fichiers avec des deux-points et des points d'interrogation? Même si ces caractères sont autorisés par le système de fichiers sur le lecteur source, ils ont tendance à être problématiques pour le travail du shell et la portabilité. De plus, rsyncl' --iconvoption n'est pas faite pour ce que vous essayez de l'utiliser.
depquid

1
@depquid c'est seulement un problème pour le travail du shell si vous écrivez du code shell buggy.
jordanm

@jordanm Je pensais davantage à l'utilisation du shell interactif. Bien sûr, cela peut être fait, mais travailler avec des caractères plus standard est plus pratique, à mon humble avis.
depquid

1
Pour info, --iconveffectue des conversions de jeux de caractères, par exemple latin1 <-> utf8. Pas ce que vous cherchez.
derobert

Réponses:


4

Rsync avec --iconvserait 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 ~/Musicvers /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 deux foo:bar.mp3et 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 globstarpar setopt dot_globet [[ $target -ot $source ]]par [[ ! -e $target || $target -ot $source ]].


2

Si c'est à des fins de sauvegarde, cachez simplement une archive tar. Aucun problème de nom de fichier de cette façon.


1
Précision sur le but (s'applique également aux autres commentaires): c'est pour un lecteur mp3 dans une voiture et le logiciel ne permet 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.
atorgovitsky

3
@atorgovitsky Vous devez modifier votre question d'origine pour fournir ces détails.
depquid
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.