Come posso sostituire i due punti quando eseguo la sincronizzazione su una chiave USB?


12

Vorrei fare il backup della mia directory di posta su una chiave USB. Tuttavia, il mio IMAP ha una strana convenzione di denominazione secondo cui qualcosa include un carattere due punti (:). Poiché l'USB è in un formato finestra, rsync non riesce a creare quei file. C'è un modo per sostituire il carattere di due punti con un trattino basso quando si esegue rsync? (O per fare la stessa sincronizzazione con un altro strumento?)

Solo alcuni punti che ho chiarito nei commenti:

  • Questo è il backup di uno scenario peggiore , vorrei poterlo leggere su un computer Windows senza installare nulla.
  • Ho molti dati che rimangono costanti. Quindi risparmio molto tempo se ho uno strumento che copia solo i file più recenti.
  • Non sto cercando una riscrittura di rsync. Sto cercando uno strumento esistente che può essere utilizzato immediatamente.

Grazie

Risposte:


8

Usa rdiff-backup invece di rsync normale. Rileverà e sostituirà automaticamente i caratteri che non sono supportati sul disco di destinazione e li rimetterà come erano quando si ripristina su un filesystem unix. Produce una directory decompressa che assomiglia all'origine più una directory di metadati aggiuntiva.


6

L'approccio più semplice è quello di sfruttare il livello del filesystem per trasformare i nomi dei file. Da Ubuntu 12.04, esiste un filesystem FUSE che trasforma i nomi dei file in nomi supportati dal VFAT di Windows: fuse-posixovl Installare il fusibile-posixovl .

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

O per evitare di richiedere l'accesso come root:

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

I caratteri nei nomi di file che VFAT non accetta sono codificati come %(XX)dove XXsono cifre esadecimali. A partire da POSIXovl 1.2.20120215, fai attenzione che un nome di file come %(3A)è codificato come se stesso e verrà decodificato come :, quindi c'è un rischio di collisione se hai nomi di file contenenti sottostringhe del modulo %(XX).

Attenzione che POSIXovl non gestisce i nomi dei file troppo lunghi. Se il nome codificato non può contenere 255 caratteri, il file non può essere memorizzato.

POSIXovl memorizza le autorizzazioni e la proprietà unix nei file chiamati .pxovl.FILENAME.


Il seguente script bash ≥4 viene copiato ~/mail/foo:barin /media/usb99/mail/foo_bar, e allo stesso modo per tutti i file in ~/mail. I file già esistenti nella struttura di destinazione e che non sono più vecchi dell'origine vengono ignorati.

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

Questo script funziona con zsh con piccole modifiche: sostituisci shopt -s dotglob globstarcon setopt dot_globe [[ $target -ot $source ]]con [[ ! -e $target || $target -ot $source ]].


Ecco una zsh a due righe (tre se conti i caricamenti automatici). È più corto, ma abbastanza avanzato e non molto leggibile.

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 zargslinea equivale a mkdir -p ~/mail/**/*(…), tranne per il fatto che non esploderà se la lunghezza cumulata dei nomi delle directory è troppo lunga. Quella riga crea le directory di destinazione secondo necessità.
  • ~/mail/**/*(/)si espande in tutte le directory in ~/mail(directory solo a causa (/)della fine).
  • (/e\''…'\')seleziona solo le directory ed esegue ulteriormente il codice all'interno di '...' per trasformare ciascun nome di file, che è memorizzato nella REPLYvariabile.
  • ${${REPLY#$HOME/}//:/_}rimuove il prefisso corrispondente alla directory di origine e cambia :in _.
  • zmv -C copia ogni file corrispondente al suo primo operando (un modello zsh) al nome del file ottenuto espandendo il suo secondo operando.
  • -o -pudice di passare -pual cpprogramma di utilità, in modo da preservare i permessi e copiare solo i file aggiornati. (Potremmo dire a zsh di eseguire il controllo degli aggiornamenti; sarebbe un po 'più veloce ma anche più criptico.)
  • (.)seleziona solo file regolari. -Qdice che questo deve essere analizzato come un qualificatore glob e non come una .tra parentesi che indica una sottoespressione.
  • $1e $2nel testo di sostituzione corrispondono le espressioni tra parentesi (**/)e *. ( **perde il suo significato speciale come zero o più livelli di sottodirectory se è tra parentesi, a meno che le parentesi non contengano esattamente **/.)

Inizialmente ho pensato di usare pax , che è uno strumento di archiviazione (qui destinato ad essere utilizzato in modalità pass-through) che ha una funzione di ridenominazione dei file (la sua -sopzione). Tuttavia, le opzioni -se -unon funzionano insieme (la definizione POSIX di pax dice letteralmente che -udeve controllare un file con lo stesso nome nella struttura di destinazione, piuttosto che il nome del file trasformato da -s; l'implementazione di pax in Ubuntu segue le specifiche letteralmente piuttosto che utilmente). È ancora possibile utilizzarlo per creare collegamenti rigidi rinominati, quindi copiare i collegamenti fissi (con rsync -auo pax -rw -pp -u) su altri supporti, ma sembra più un problema di quanto valga la pena.

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

Proverò ad usare pax. Forse potresti migliorare la tua risposta specificando il pacchetto necessario su Ubuntu. Non sembra far parte della normale installazione.
Guillaume Coté,

Basta aggiungere un singolo pacchetto chiamato pax per farlo funzionare.
Guillaume Coté,

Non produce nulla, provo ad aggiungere un'opzione -v per vedere cosa sta succedendo. Sembra che stia copiando tutto ogni volta. Il punto di rsync è di essere incrementale, il che mi ha fatto risparmiare un sacco di tempo quando ho solo alcuni file modificati nel mezzo di molti file.
Guillaume Coté,

Sembra che stia creando una directory 'home' sotto il percorso che ho specificato. Si consiglia di evitare di cambiare directory nello script, c'è un'altra possibilità per evitare la creazione di tutte quelle directory?
Guillaume Coté,

Ci sono voluti cinque minuti per un secondo passaggio in cui tutto era identico. rsync avrebbe impiegato solo pochi secondi. C'è un'opzione che deve essere specificata per renderla incrementale?
Guillaume Coté,

-1

Quello che faccio con la mia chiavetta USB e il mio disco USB mobile è partizionarli con 2 partizioni: una FAT32 e una ext4. Il primo che posso usare per scambiare dati con utenti non Linux, il secondo per il mio uso personale con i miei sistemi Ubuntu (e forse per lo scambio con altri utenti Linux). Su una partizione ext4, non avrai il problema ":".


Vorrei che il mio backup fosse leggibile ovunque nel caso avessi bisogno di informazioni su un computer Windows. In caso contrario, avrei riformattato la chiave USB in un file system unix. Ecco perché sto chiedendo la sostituzione.
Guillaume Coté,

Bene, è possibile leggere almeno ext2 / ext3 su Windows se si installano alcuni strumenti o driver di file system. Vuoi essere in grado di leggerlo su ogni sistema Windows o solo sui tuoi sistemi (dove puoi installare gli strumenti necessari se ne avessi bisogno)?
JanC

A proposito: in teoria dovrebbe essere possibile archiviarlo anche su un sistema NTFS, ma la maggior parte delle applicazioni Windows (inclusa la maggior parte di Microsoft) non supporta correttamente NTFS ...: P
JanC

È il backup di recupero del caso peggiore, quindi voglio essere pronto per il caso in cui ho bisogno di qualcosa di veloce, non ho il diritto di installare nulla su un computer.
Guillaume Coté,

-2

È possibile utilizzare tarper creare un archivio. In questo modo non è necessario modificare i nomi e salvarlo nel file system desiderato.


Potrei fare lo stesso con un file zip o un tgz, ma riscriverà il file che non è cambiato ogni volta. Dato che i media hanno un numero limitato di scritture e ho ottenuto diversi dati Gib, vorrei evitare di riscrivere il tutto solo perché è stato aggiunto un nuovo file da 1kb.
Guillaume Coté,

Le riscritture su una recente memoria flash sono "limitate" a un numero di milioni o almeno centinaia di migliaia di solito. Dubito che tu abbia intenzione di fare tanti backup. ;)
gennaio

2
-1 -azv non crea un archivio, fa una copia in modalità archivio il che significa che mantiene gli attributi del file
João Pinto

sry, pensavo davvero che rsync potesse farlo, cambiato in tar, ma non so se tar può fare backup incrementali. Comunque JanC ha ragione e le riscritture non dovrebbero essere un problema.
David,

Per quanto riguarda i commenti di JanC sulle riscritture, non è solo il fatto che esiste un limite (l'ultima volta che controllo, era più vicino a mille che un milione), ma anche il fatto che non mi piace aspettare diverse ore per qualcosa che dovrebbe essere meno di un minuto.
Guillaume Coté,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.