Jak mogę zastąpić dwukropki, kiedy rsync na kluczu USB?

12

Chciałbym wykonać kopię zapasową mojego katalogu poczty na kluczu USB. Jednak mój IMAP ma dziwną konwencję nazewnictwa, w której coś zawiera znak dwukropka (:). Ponieważ USB ma format okna, rsync nie może utworzyć tego pliku. Czy istnieje sposób na zastąpienie znaku dwukropka znakiem podkreślenia podczas uruchamiania rsync? (Lub zrobić tę samą synchronizację z innym narzędziem?)

Tylko kilka punktów, które wyjaśniłem w komentarzach:

  • Jest to najgorszy przypadek tworzenia kopii zapasowej, chciałbym móc go odczytać na komputerze z systemem Windows bez instalowania czegokolwiek.
  • Mam dużo danych, które pozostają stałe. Oszczędzam więc dużo czasu, jeśli mam narzędzie, które po prostu kopiuje nowsze pliki.
  • Nie szukam przepisania rsync. Szukam istniejącego narzędzia, z którego można korzystać po wyjęciu z pudełka.

Dzięki

Guillaume Coté
źródło

Odpowiedzi:

8

Użyj rdiff-backup zamiast zwykłego rsync. Automatycznie wykryje i zastąpi znaki, które nie są obsługiwane na dysku docelowym, a także przywróci je tak, jak były podczas przywracania do systemu plików Unix. Tworzy rozpakowany katalog, który wygląda podobnie do źródła, plus jeden dodatkowy katalog metadanych.

poolie
źródło
6

Najprostszym podejściem jest wykorzystanie warstwy systemu plików do przekształcenia nazw plików. Od Ubuntu 12.04 istnieje system plików FUSE, który przekształca nazwy plików w nazwy obsługiwane przez VFAT systemu Windows: fuse-posixovl Zainstaluj bezpiecznik-posixovl .

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

Lub, aby uniknąć konieczności dostępu do konta root:

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

Znaki w nazwach plików, których VFAT nie akceptuje, są kodowane tak, jak w %(XX)przypadku XXcyfr szesnastkowych. Począwszy od POSIXovl 1.2.20120215, strzeż się, że nazwa pliku taka %(3A)jest zakodowana jako sama i zostanie zdekodowana jako :, więc istnieje ryzyko kolizji, jeśli masz nazwy plików zawierające podciągi formularza %(XX).

Uwaga: POSIXovl nie radzi sobie z zbyt długimi nazwami plików. Jeśli zakodowana nazwa nie mieści się w 255 znakach, pliku nie można zapisać.

POSIXovl przechowuje uprawnienia uniksowe i własność w plikach o nazwie .pxovl.FILENAME.


Poniższy skrypt bash ≥4 kopiuje ~/mail/foo:bardo /media/usb99/mail/foo_bari podobnie dla wszystkich plików poniżej ~/mail. Pliki, które już istnieją w drzewie docelowym i nie są starsze niż źródło, są pomijane.

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

Ten skrypt działa pod Zsh z niewielkimi modyfikacjami: zamień shopt -s dotglob globstarna setopt dot_globi [[ $target -ot $source ]]przez [[ ! -e $target || $target -ot $source ]].


Oto dwuwarstwowy zsh (trzy, jeśli policzysz automatyczne ładowanie). Jest krótszy, ale dość zaawansowany i niezbyt czytelny.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • zargsLinia jest równoznaczne mkdir -p ~/mail/**/*(…)z tym, że to nie będzie bombardować, jeśli całkowita długość nazwy katalogów są zbyt długie. Linia ta tworzy katalogi docelowe w razie potrzeby.
  • ~/mail/**/*(/)rozwija się do wszystkich katalogów w ~/mail(katalogi tylko ze względu (/)na koniec).
  • (/e\''…'\')wybiera tylko katalogi i dalej wykonuje kod w obrębie „…”, aby przekształcić nazwę każdego pliku, który jest przechowywany w REPLYzmiennej.
  • ${${REPLY#$HOME/}//:/_}usuwa prefiks odpowiadający katalogowi źródłowemu i zmienia się :na _.
  • zmv -C kopiuje każdy plik pasujący do pierwszego operandu (wzorzec Zsh) do nazwy pliku uzyskanej przez rozwinięcie drugiego operandu.
  • -o -pumówi, aby przejść -pudo cpnarzędzia, aby zachować uprawnienia i kopiować tylko zaktualizowane pliki. (Moglibyśmy powiedzieć zsh, aby sprawdził aktualizację; byłoby to trochę szybsze, ale jeszcze bardziej tajemnicze).
  • (.)wybiera tylko zwykłe pliki. -Qmówi, że należy to przeanalizować jako kwalifikator globalny, a nie jako .nawiasy wokół niego wskazujące na podwyrażenie.
  • $1a $2w tekście zastępczym pasują do wyrażeń w nawiasach (**/)i *. ( **traci swoje specjalne znaczenie jako zero lub więcej poziomów podkatalogów, jeśli jest w nawiasach, chyba że nawiasy zawierają dokładnie **/.)

Początkowo myślałem o użyciu pax , który jest narzędziem do archiwizacji (tutaj przeznaczonym do użycia w trybie tranzytowym), który ma funkcję zmiany nazwy pliku (jego -sopcja). Jednak -si -uopcje nie działają razem (the definition POSIX z pax dosłownie mówi, że -umusi sprawdzić plik o tej samej nazwie w drzewie docelowym, zamiast nazwy pliku przekształconego przez -s; realizacja pax w Ubuntu następuje spec dosłownie zamiast pożytecznie). Nadal można go używać do tworzenia twardych linków o zmienionych nazwach, a następnie kopiować twarde linki (za pomocą rsync -aulub pax -rw -pp -u) na inne media, ale sprawia to więcej kłopotów niż jest to warte.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Gilles „SO- przestań być zły”
źródło
Spróbuję użyć pax. Może mógłbyś poprawić swoją odpowiedź, określając potrzebny pakiet na Ubuntu. Nie wydaje się być częścią normalnej instalacji.
Guillaume Coté
Dodanie jednego pakietu o nazwie pax sprawia, że ​​działa.
Guillaume Coté
Nic nie wyświetla, próbuję dodać opcję -v, aby zobaczyć, co się dzieje. Wydaje się, że kopiuje wszystko za każdym razem. Rsync ma być przyrostowy, co pozwoliło mi zaoszczędzić dużo czasu, gdy mam tylko kilka zmodyfikowanych plików w środku wielu plików.
Guillaume Coté
Wygląda na to, że tworzy katalog „domowy” pod podaną przeze mnie ścieżką. Zaleca się unikanie zmiany katalogu w skrypcie, czy jest jeszcze jedna możliwość uniknięcia tworzenia wszystkich tych katalogów?
Guillaume Coté
Drugie przejście zajęło pięć minut, gdy wszystko było identyczne. rsync zajęłoby tylko kilka sekund. Czy istnieje opcja, która musi zostać określona, ​​aby była przyrostowa?
Guillaume Coté
-1

To, co robię z moją pamięcią USB i mobilnym dyskiem USB, to dzielenie ich na dwie partycje: FAT32 i ext4. Pierwszego mogę użyć do wymiany danych z użytkownikami innymi niż Linux, drugiego do osobistego użytku z moimi systemami Ubuntu (i być może do wymiany z innymi użytkownikami Linuksa). Na partycji ext4 nie będziesz miał problemu „:”.

JanC
źródło
Chciałbym, aby moja kopia zapasowa była czytelna w dowolnym miejscu na wypadek, gdy potrzebuję informacji na komputerze z systemem Windows. Jeśli nie, sformatowałbym klucz USB do systemu plików UNIX. Dlatego pytam o zamianę.
Guillaume Coté
Cóż, to jest możliwe, aby przeczytać co najmniej ext2 / ext3 na Windows w przypadku instalowania niektórych narzędzi lub sterowniki systemu plików. Czy chcesz móc go czytać w każdym systemie Windows, czy tylko we własnych systemach (gdzie możesz zainstalować niezbędne narzędzia, jeśli są potrzebne)?
JanC
BTW: teoretycznie powinno być możliwe przechowywanie go również w systemie NTFS, ale większość aplikacji Windows (w tym większość z Microsoft) nie obsługuje poprawnie NTFS ...: P
JanC
Jest to najgorsza kopia zapasowa odzyskiwania, więc chcę się przygotować na wypadek, gdy potrzebuję czegoś szybkiego, nie mam prawa instalować niczego na komputerze.
Guillaume Coté
-2

Możesz użyć tardo utworzenia archiwum. W ten sposób nie musisz zmieniać nazw i możesz zapisać je w dowolnym systemie plików.

David
źródło
Mógłbym zrobić to samo z plikiem zip lub tgz, ale spowoduje to przepisanie pliku, który nie zmieniał się za każdym razem. Ponieważ media mają ograniczoną liczbę zapisów i mam kilka danych Gib, chciałbym uniknąć przepisywania tego wszystkiego tylko dlatego, że dodano nowy plik 1kb.
Guillaume Coté
Przepisania najnowszej pamięci flash są „ograniczone” do wielu milionów lub co najmniej setek tysięcy. Wątpię, czy planujesz zrobić tyle kopii zapasowych. ;)
JanC
2
-1 -azv nie tworzy archiwum, robi kopię w trybie archiwum, co oznacza, że ​​zachowuje atrybuty plików
João Pinto,
sry, naprawdę myślałem, że rsync może to zrobić, zmieniło się na tar, ale nie wiem, czy tar może tworzyć przyrostowe kopie zapasowe. Jednak JanC ma rację i przepisywanie nie powinno stanowić problemu.
David
Jeśli chodzi o komentarze JanC dotyczące przepisywania, to nie tylko fakt, że istnieje limit (ostatnim razem, gdy sprawdzam, był bliżej tysiąca na milion), ale także fakt, że nie lubię czekać kilka godzin na coś, co powinno być mniej niż minutę.
Guillaume Coté