Was ist der beste Weg, um Dateien mit einer VFAT-Partition zu synchronisieren?

7

POSIX-Dateinamen können alle Zeichen außer enthalten /, aber einige Dateisysteme reservieren Zeichen wie ?<>\\:*|". Mit paxkann ich Dateien kopieren, während ich diese reservierten Zeichen ersetze:

$ pax -rw -s '/[?<>\\:*|\"]/_/gp' /source /target

Es paxfehlt jedoch eine --deleteOption wie rsyncund rsynckann keine Zeichen ersetzen. Ich suche nach einer einfachen Möglichkeit, meine Musiksammlung regelmäßig auf einer externen Festplatte zu sichern.

Frank
quelle
Haben Sie sich diese Methode mit rsync angesehen? serverfault.com/questions/54949/…
slm
Vielen Dank, gut zu wissen über die --modify-windowOption für rsync. Die Zeichensubstitution wird jedoch nicht gelöst.
Frank
Ich konnte keine andere Methode finden, um das zu tun, was Sie verlangen. Ich sage nicht, dass es das nicht gibt, aber als ich das recherchierte, fand ich nichts Vielversprechendes.
slm
Ich habe keine Ahnung, wie ich das lösen soll, aber ich werde kommentieren, dass ich denke, dass Ihre Liste der reservierten Zeichen unvollständig ist. AFAIK +und ;sollte möglicherweise da drin sein. Der einzige Weg, um sicher zu sein, ist zu testen ...
Graeme
Was macht rsync überhaupt, wenn es diese Zeichen erfüllt? Erhalten Sie einen E / A-Fehler?
Graeme

Antworten:

5

Sie können eine Ansicht des FAT-Dateisystems mit POSIX-Semantik erstellen, einschließlich unterstützender Dateinamen mit einem anderen Zeichen als /oder einem Null-Byte. POSIXovl ist hierfür ein relativ neues FUSE- Dateisystem.

mkdir backup-fat
mount.posixovl -S /media/sdb1 backup-fat
rsync -au /source backup-fat/target

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

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

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

Gilles 'SO - hör auf böse zu sein'
quelle
Verfügbar als Debian-Paket ( fuse-posixovl) und funktioniert wie ein Zauber.
Frank
Verfügbar als posixovl unter openSUSE.
Fleamour
2

Ich war neugierig darauf und habe ein bisschen gegraben.

Es gibt ein paar Patches, die es nie in rsync geschafft haben, wenn Sie Lust haben, aus dem Quellcode zu kompilieren. Obwohl beide alt sind, funktionieren sie möglicherweise noch nicht. Dieser fügt speziell eine --fat-filenamesOption hinzu und dieser für eine --trOption .

Diese Fragen betreffen auch etwas Ähnliches - Rsyncing-Dateien mit Sonderzeichen wie USB FAT32 und /ubuntu/11634/how-can-i-substitute-colons-when-i-rsync-on-a-usb- Schlüssel . Die beste Wette ist wahrscheinlich rdiff-backup, das die Substitution durchführt, aber ich sehe keine Optionen, um die Kontrolle darüber zu haben. Es gibt aber auch einige andere gute Ideen.

Eine grobe Idee für ein Skript, das die Dateien jedes Mal löscht und neu erstellt, wenn nicht zu viele vorhanden sind, wäre etwa:

[sudo] updatedb      # doing this as root will update the system database
locate -r '^/full/path/to/source/.*[?<>\\:*|\"]' |
  sed 's\^/full/path/to/source/\\' >bad_names
rsync --delete --exclude-from=bad_names -av source/ target
cd source
<bad_names pax -rw -s '/[?<>\\:*|\"]/_/gp' target

locatewäre schneller als findwenn die Datenbank einigermaßen aktuell wäre.

Schließlich können Sie dies einfach tun, damit die Dateien keine Probleme mehr verursachen (zumindest die derzeit vorhandenen):

find source/ -regex '[?<>\\:*|\"]' -exec rename 's/'[?<>\\:*|\"]'/_/g' {} +

Ich würde empfehlen, dies rename -nzuerst zu versuchen, falls etwas schief geht.

Graeme
quelle
Danke für die Untersuchung. Schade, dass rsync diese Patachen nicht enthielt. Wenn ein Skript die Lösung ist, sind Ihre Ideen sehr nützlich.
Frank