Wie kann ich Doppelpunkte ersetzen, wenn ich auf einem USB-Stick synchronisiere?


12

Ich möchte mein Mail-Verzeichnis auf einem USB-Stick sichern. Mein IMAP hat jedoch eine seltsame Namenskonvention, die einen Doppelpunkt (:) enthält. Da der USB in einem Fensterformat vorliegt, kann rsync diese Datei nicht erstellen. Gibt es eine Möglichkeit, das Doppelpunktzeichen durch einen Unterstrich zu ersetzen, wenn rsync ausgeführt wird? (Oder die gleiche Synchronisation mit einem anderen Tool durchführen?)

Nur ein paar Punkte, die ich in den Kommentaren klargestellt habe:

  • Dies ist ein Worst-Case-Szenario- Backup. Ich möchte es auf einem Windows-Computer lesen können, ohne etwas zu installieren.
  • Ich habe viele Daten, die konstant bleiben. Ich spare also viel Zeit, wenn ich ein Tool habe, das nur die neueren Dateien kopiert.
  • Ich suche keine Neuschreibung von Rsync. Ich suche ein vorhandenes Tool, das sofort verwendet werden kann.

Vielen Dank

Antworten:


8

Verwenden Sie rdiff-backup anstelle von plain rsync. Zeichen, die auf der Zieldiskette nicht unterstützt werden, werden automatisch erkannt und ersetzt. Sie werden auch so zurückgesetzt, wie sie waren, als Sie sie auf einem Unix-Dateisystem wiederhergestellt haben. Es wird ein entpacktes Verzeichnis erstellt, das genau wie der Ursprung aussieht, sowie ein zusätzliches Metadatenverzeichnis.


6

Am einfachsten ist es, die Dateisystemebene zu nutzen, um die Dateinamen zu transformieren. Seit Ubuntu 12.04 gibt es ein FUSE- Dateisystem, das Dateinamen in Namen umwandelt, die von Windows VFAT unterstützt werden: fuse-posixovl Installieren Sie die Sicherung-Posixovl .

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

Oder um zu vermeiden, dass Root-Zugriff erforderlich ist:

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

Zeichen in Dateinamen , dass VFAT nicht akzeptiert codiert sind , als %(XX)wo XXsind hexadezimale Ziffern. Achten Sie ab POSIXovl 1.2.20120215 darauf, dass ein Dateiname wie derselbe als solcher %(3A)codiert und als solcher decodiert wird. Daher :besteht Kollisionsgefahr, wenn Sie Dateinamen haben, die Teilzeichenfolgen des Formulars enthalten %(XX).

Beachten Sie, dass POSIXovl mit zu langen Dateinamen nicht zurechtkommt. Wenn der verschlüsselte Name nicht in 255 Zeichen passt, kann die Datei nicht gespeichert werden.

POSIXovl speichert Unix-Berechtigungen und -Eigentum in den aufgerufenen Dateien .pxovl.FILENAME.


Die folgenden bash ≥4 Skript kopiert ~/mail/foo:barzu/media/usb99/mail/foo_bar und für alle Dateien unter~/mail . Dateien, die bereits in der Zielstruktur vorhanden sind und nicht älter als die Quelle sind, werden übersprungen.

#!/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

Dieses Skript funktioniert unter zsh mit geringfügigen Änderungen: Ersetzen shopt -s dotglob globstardurchsetopt dot_glob und [[ $target -ot $source ]]durch [[ ! -e $target || $target -ot $source ]].


Hier ist ein Zsh-Two-Liner (drei, wenn Sie die Autoloads zählen). Es ist kürzer, aber ziemlich weit fortgeschritten und wenig lesbar.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • Das zargs Zeile ist äquivalent zu mkdir -p ~/mail/**/*(…), außer dass sie nicht bombardiert wird, wenn die kumulierte Länge der Verzeichnisnamen zu lang ist. Diese Zeile erstellt die Zielverzeichnisse nach Bedarf.
  • ~/mail/**/*(/) Erweitert alle Verzeichnisse unter ~/mail (Verzeichnisse nur aufgrund der (/)am Ende).
  • (/e\''…'\')Wählt nur Verzeichnisse aus und führt den Code innerhalb von '…' weiter aus, um jeden in der REPLYVariablen gespeicherten Dateinamen zu transformieren .
  • ${${REPLY#$HOME/}//:/_} Entfernt das Präfix, das dem Quellverzeichnis entspricht, und ändert es : zu _.
  • zmv -C kopiert jede Datei, die ihrem ersten Operanden (einem zsh-Muster) entspricht, in den Dateinamen, der durch Erweitern ihres zweiten Operanden erhalten wird.
  • -o -pusagt an -pudas cpDienstprogramm übergeben, um Berechtigungen zu erhalten und nur aktualisierte Dateien zu kopieren. (Wir könnten zsh anweisen, die Update-Prüfung durchzuführen. Sie wäre etwas schneller, aber noch kryptischer.)
  • (.)Wählt nur normale Dateien aus. -Qgibt an, dass dies als Glob-Qualifikationsmerkmal analysiert werden soll und nicht als .Klammer, die einen Unterausdruck angibt.
  • $1und $2stimmen im Ersetzungstext mit den Ausdrücken in Klammern (**/)und überein *. ( **Verliert seine spezielle Bedeutung als null oder mehr Unterverzeichnisebenen, wenn es in Klammern steht, es sei denn, die Klammern enthalten genau **/.)

Ursprünglich dachte ich an die Verwendung von pax , einem Archivierungstool (hier für den Passthrough-Modus vorgesehen) mit einer Funktion zum Umbenennen von Dateien ( -soptional). Die Optionen -sund -ufunktionieren jedoch nicht zusammen (die POSIX-Definition von pax besagt wörtlich, dass -ueine Datei mit demselben Namen im Zielbaum geprüft werden muss und nicht der von transformierte Dateiname -s; die pax-Implementierung in Ubuntu folgt der Spezifikation wörtlich und nicht nützlich). Es ist immer noch möglich, damit umbenannte Hardlinks zu erstellen und die Hardlinks dann (mit rsync -auoder pax -rw -pp -u) auf die anderen Medien zu kopieren , aber es bereitet mehr Mühe als es wert ist.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/

Ich werde versuchen, pax zu benutzen. Vielleicht können Sie Ihre Antwort verbessern, indem Sie das auf Ubuntu benötigte Paket angeben. Es scheint nicht Teil der normalen Installation zu sein.
Guillaume Coté

Wenn Sie nur ein einzelnes Paket mit dem Namen pax hinzufügen, funktioniert es.
Guillaume Coté

Es wird nichts ausgegeben, ich versuche eine -v-Option hinzuzufügen, um zu sehen, was los ist. Es scheint immer alles zu kopieren. Der Punkt von rsync ist, inkrementell zu sein, was mir viel Zeit gespart hat, wenn ich nur ein paar geänderte Dateien in der Mitte vieler Dateien habe.
Guillaume Coté

Es scheint, als würde ein 'Home'-Verzeichnis unter dem von mir angegebenen Pfad erstellt. Es wird empfohlen, das Ändern des Verzeichnisses im Skript zu vermeiden. Gibt es eine andere Möglichkeit, die Erstellung all dieser Verzeichnisse zu vermeiden?
Guillaume Coté

Bei einem zweiten Durchgang, bei dem alles identisch war, dauerte es fünf Minuten. rsync hätte nur ein paar Sekunden gedauert. Gibt es eine Option, die angegeben werden muss, um es inkrementell zu machen?
Guillaume Coté

-1

Was ich mit meinem USB-Speicherstick und meinem mobilen USB-Laufwerk mache, ist, sie mit zwei Partitionen zu partitionieren: einer FAT32-Partition und einer ext4-Partition. Das erste kann ich für den Datenaustausch mit Nicht-Linux-Benutzern verwenden, das zweite für den persönlichen Gebrauch mit meinen Ubuntu-Systemen (und möglicherweise für den Austausch mit anderen Linux-Benutzern). Auf einer ext4-Partition tritt das Problem ":" nicht auf.


Ich möchte, dass mein Backup überall lesbar ist, falls ich Informationen auf einem Windows-Computer benötige. Wenn nicht, hätte ich den USB-Schlüssel in ein Unix-Dateisystem umformatiert. Deshalb frage ich nach Substitution.
Guillaume Coté

Nun, es ist möglich, mindestens ext2 / ext3 unter Windows zu lesen, wenn Sie einige Tools oder Dateisystemtreiber installieren. Möchten Sie es auf jedem Windows-System oder nur auf Ihren eigenen Systemen lesen können (wo Sie die erforderlichen Tools installieren können, wenn Sie sie benötigen)?
6.

Übrigens: Theoretisch sollte es auch möglich sein, es auf einem NTFS-System zu speichern, aber die meisten Windows-Anwendungen (einschließlich der meisten von Microsoft) unterstützen NTFS nicht richtig ...: P
JanC

Da es sich um eine Wiederherstellung im schlimmsten Fall handelt, möchte ich mich auf den Fall vorbereiten, dass ich schnell etwas benötige, ohne das Recht zu haben, etwas auf einem Computer zu installieren.
Guillaume Coté

-2

Sie könnten verwenden tar, um ein Archiv zu erstellen. Auf diese Weise müssen Sie die Namen nicht ändern und können sie in einem beliebigen Dateisystem speichern.


Ich könnte dasselbe mit einer zip-Datei oder einer tgz machen, aber es wird die Datei neu schreiben, die sich nicht jedes Mal geändert hat. Da das Medium nur eine begrenzte Anzahl von Schreibvorgängen enthält und ich mehrere Gib Daten habe, möchte ich vermeiden, das Ganze neu zu schreiben, nur weil eine neue 1-KB-Datei hinzugefügt wurde.
Guillaume Coté

Die Umschreibungen auf einem neueren Flash-Speicher sind normalerweise auf eine Anzahl von Millionen oder mindestens Hunderttausenden "beschränkt". Ich bezweifle, dass Sie so viele Backups planen. ;)
5.

2
-1 -azv erstellt kein Archiv, es erstellt eine Kopie im Archivmodus, was bedeutet, dass die Dateiattribute beibehalten werden
João Pinto

sry, dachte wirklich, rsync könnte das tun, wechselte zu tar, aber ich weiß nicht, ob tar inkrementelle Backups durchführen kann. Allerdings hat JanC recht und das Umschreiben sollte kein Problem sein.
David

In Bezug auf JanC-Kommentare zu Umschreibungen liegt es nicht nur an der Tatsache, dass es ein Limit gibt (das letzte Mal habe ich überprüft, dass es näher an tausend als eine Million lag), sondern auch an der Tatsache, dass ich nicht gerne mehrere Stunden auf etwas warten möchte, das sollte weniger als eine Minute sein.
Guillaume Coté
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.