Comment puis-je remplacer les deux-points lorsque je rsync sur une clé USB?

12

Je voudrais sauvegarder mon répertoire de messagerie sur une clé USB. Cependant, mon IMAP a une convention de dénomination étrange selon laquelle quelque chose inclut un caractère deux-points (:). Étant donné que l'USB est dans un format de fenêtre, rsync ne parvient pas à créer ces fichiers. Existe-t-il un moyen de remplacer le caractère deux-points par un trait de soulignement lors de l'exécution de rsync? (Ou pour faire la même synchronisation avec un autre outil?)

Juste quelques points que j'ai clarifiés dans les commentaires:

  • Il s'agit du pire scénario de sauvegarde, j'aimerais pouvoir le lire sur une machine Windows sans rien installer.
  • J'ai beaucoup de données qui restent constantes. Je gagne donc beaucoup de temps si j'ai un outil qui copie simplement les fichiers les plus récents.
  • Je ne cherche pas une réécriture de rsync. Je suis à la recherche d'un outil existant qui peut être utilisé hors de la boîte.

Merci

Guillaume Coté
la source

Réponses:

8

Utilisez rdiff-backup au lieu de plain rsync. Il détectera et remplacera automatiquement les caractères qui ne sont pas pris en charge sur le disque de destination, et les remettra également tels qu'ils étaient lorsque vous effectuez une restauration sur un système de fichiers Unix. Il produit un répertoire décompressé qui ressemble à l'origine plus un répertoire de métadonnées supplémentaire.

poolie
la source
6

L'approche la plus simple consiste à tirer parti de la couche du système de fichiers pour transformer les noms de fichiers. Depuis Ubuntu 12.04, il existe un système de fichiers FUSE qui transforme les noms de fichiers en noms pris en charge par le VFAT de Windows: fuse-posixovl Installer fuse-posixovl .

sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/

Ou pour éviter d'exiger un accès root:

mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/

Les caractères dans les noms de fichiers que VFAT n'accepte pas sont codés comme %(XX)XXsont les chiffres hexadécimaux. À partir de POSIXovl 1.2.20120215, sachez qu'un nom de fichier comme %(3A)est codé comme lui-même et sera décodé en tant que :, il y a donc un risque de collision si vous avez des noms de fichiers contenant des sous-chaînes du formulaire %(XX).

Attention, POSIXovl ne gère pas les noms de fichiers trop longs. Si le nom codé ne tient pas en 255 caractères, le fichier ne peut pas être stocké.

POSIXovl stocke les autorisations et la propriété Unix dans les fichiers appelés .pxovl.FILENAME.


Le script bash ≥4 suivant est copié ~/mail/foo:barsur /media/usb99/mail/foo_bar, et de même pour tous les fichiers sous ~/mail. Les fichiers qui existent déjà dans l'arborescence de destination et qui ne sont pas plus anciens que la source sont ignorés.

#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; 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 ]].


Voici un zsh à deux lignes (trois si vous comptez les chargements automatiques). C'est plus court, mais assez avancé et peu lisible.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • La zargsligne est équivalente à mkdir -p ~/mail/**/*(…), sauf qu'elle ne bombardera pas si la longueur cumulée des noms de répertoire est trop longue. Cette ligne crée les répertoires cibles selon les besoins.
  • ~/mail/**/*(/)s'étend à tous les répertoires sous ~/mail(répertoires uniquement en raison de (/)la fin).
  • (/e\''…'\')sélectionne uniquement les répertoires et exécute ensuite le code dans «…» pour transformer chaque nom de fichier, qui est stocké dans la REPLYvariable.
  • ${${REPLY#$HOME/}//:/_}supprime le préfixe correspondant au répertoire source et se transforme :en _.
  • zmv -C copie chaque fichier correspondant à son premier opérande (un modèle zsh) dans le nom de fichier obtenu en développant son deuxième opérande.
  • -o -pudit de passer -puà l' cputilitaire, afin de conserver les autorisations et de copier uniquement les fichiers mis à jour. (Nous pourrions dire à zsh d'effectuer la vérification de la mise à jour; ce serait un peu plus rapide mais encore plus cryptique.)
  • (.)sélectionne uniquement les fichiers normaux. -Qdit que cela doit être analysé comme un qualificatif glob et non comme .avec des parenthèses autour d'elle indiquant une sous-expression.
  • $1et $2dans le texte de remplacement correspondent aux expressions entre parenthèses (**/)et *. ( **perd sa signification spéciale comme zéro ou plusieurs niveaux de sous-répertoire s'il est entre parenthèses, sauf si les parenthèses contiennent exactement **/.)

J'ai d'abord pensé à utiliser pax , qui est un outil d'archivage (ici destiné à être utilisé en mode pass-through) qui a une fonction de changement de nom de fichier (son -soption). Cependant, les options -set -une fonctionnent pas ensemble (la définition POSIX de pax dit littéralement que -udoit vérifier un fichier du même nom dans l'arborescence de destination, plutôt que le nom de fichier transformé par -s; l'implémentation de pax dans Ubuntu suit la spécification littéralement plutôt que utilement). Il est toujours possible de l'utiliser pour créer des liens durs renommés, puis de copier les liens durs (avec rsync -auou pax -rw -pp -u) sur les autres supports, mais cela semble plus problématique que cela ne vaut.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Gilles 'SO- arrête d'être méchant'
la source
Je vais essayer d'utiliser pax. Peut-être pourriez-vous améliorer votre réponse en spécifiant le paquet nécessaire sur ubuntu. Il ne semble pas faire partie de l'installation normale.
Guillaume Coté
Il suffit d'ajouter un seul paquet appelé pax pour que cela fonctionne.
Guillaume Coté
Il ne produit rien, j'essaie d'ajouter une option -v pour voir ce qui se passe. Il semble tout copier à chaque fois. Le but de rsync est d'être incrémental, ce qui m'a fait gagner beaucoup de temps lorsque je n'ai que quelques fichiers modifiés au milieu de beaucoup de fichiers.
Guillaume Coté
Il semble créer un répertoire «home» sous le chemin que j'ai spécifié. Il est recommandé d'éviter de changer de répertoire dans le script, existe-t-il une autre possibilité pour éviter la création de tous ces répertoires?
Guillaume Coté
Il a fallu cinq minutes pour une deuxième passe où tout était identique. rsync n'aurait pris que quelques secondes. Existe-t-il une option qui doit être spécifiée pour la rendre incrémentielle?
Guillaume Coté
-1

Ce que je fais avec ma clé USB et mon disque USB mobile, c'est de les partitionner avec 2 partitions: une FAT32 et une ext4. Le premier que je peux utiliser pour échanger des données avec des utilisateurs non linux, le second pour mon usage personnel avec mes systèmes Ubuntu (et peut-être pour échanger avec d'autres utilisateurs linux). Sur une partition ext4, vous n'aurez pas le problème ":".

JanC
la source
Je voudrais que ma sauvegarde soit lisible n'importe où au cas où j'aurais besoin d'informations sur un ordinateur Windows. Sinon, j'aurais reformaté la clé USB vers un système de fichiers Unix. C'est pourquoi je pose des questions sur la substitution.
Guillaume Coté
Eh bien, il est possible de lire au moins ext2 / ext3 sous Windows si vous installez des outils ou des pilotes de système de fichiers. Voulez-vous pouvoir le lire sur tous les systèmes Windows, ou uniquement sur vos propres systèmes (où vous pouvez installer les outils nécessaires si vous en avez besoin)?
janvier 2010 à 6h11
BTW: en théorie, il devrait également être possible de le stocker sur un système NTFS, mais la plupart des applications Windows (y compris la plupart de Microsoft) ne prennent pas correctement en charge NTFS ...: P
JanC
C'est une pire sauvegarde de récupération de cas, donc je veux me préparer au cas où j'ai besoin de quelque chose de rapide, je n'ai pas le droit d'installer quoi que ce soit sur un ordinateur.
Guillaume Coté
-2

Vous pouvez utiliser tarpour créer une archive. De cette façon, vous n'avez pas à modifier les noms et pouvez l'enregistrer dans le système de fichiers que vous souhaitez.

David
la source
Je pourrais faire la même chose avec un fichier zip ou un tgz, mais ça va réécrire le fichier qui n'a pas changé à chaque fois. Étant donné que le support contient un nombre limité d'écriture et que j'ai obtenu plusieurs fichiers de données, je voudrais éviter de réécrire le tout simplement parce qu'un nouveau fichier de 1 Ko a été ajouté.
Guillaume Coté
Les réécritures sur une mémoire flash récente sont "limitées" à un certain nombre de millions ou au moins des centaines de milliers habituellement. Je doute que vous envisagiez d'effectuer autant de sauvegardes. ;)
janvier 2010
2
-1 -azv ne crée pas d'archive, il fait une copie en mode archive, ce qui signifie qu'il conserve les attributs de fichier
João Pinto
sry, vraiment pensé que rsync pourrait faire ça, changé en tar, mais je ne sais pas si tar peut faire des sauvegardes incrémentielles. Cependant JanC a raison et les réécritures ne devraient pas être un problème.
david
En ce qui concerne les commentaires de JanC sur les réécritures, ce n'est pas seulement le fait qu'il y a une limite (la dernière fois que je vérifie, c'était plus proche de mille qu'un million), mais aussi le fait que je n'aime pas attendre plusieurs heures pour quelque chose qui devrait être inférieure à une minute.
Guillaume Coté