Bagaimana saya bisa mengganti titik dua ketika saya rsync pada kunci USB?

12

Saya ingin mem-backup direktori mail saya pada kunci USB. Namun, IMAP saya memiliki konvensi penamaan yang aneh bahwa sesuatu menyertakan karakter titik dua (:). Karena USB dalam format jendela, rsync gagal membuat file tersebut. Apakah ada cara untuk mengganti karakter titik dua dengan garis bawah saat menjalankan rsync? (Atau untuk melakukan sinkronisasi yang sama dengan alat lain?)

Hanya beberapa hal yang saya perjelas dalam komentar:

  • Ini adalah cadangan skenario terburuk , saya ingin dapat membacanya di mesin windows tanpa menginstal apa pun.
  • Saya mendapat banyak data yang tetap konstan. Jadi saya menghemat banyak waktu jika saya memiliki alat yang hanya menyalin file yang lebih baru.
  • Saya tidak mencari penulisan ulang rsync. Saya mencari alat yang ada yang dapat digunakan di luar kotak.

Terima kasih

Guillaume Coté
sumber

Jawaban:

8

Gunakan rdiff-backup alih - alih rsync biasa. Ini akan secara otomatis mendeteksi dan mengganti karakter yang tidak didukung pada disk tujuan, dan juga mengembalikannya seperti ketika Anda mengembalikan ke sistem file unix. Ini menghasilkan direktori dibongkar yang terlihat seperti asal ditambah satu direktori metadata tambahan.

poolie
sumber
6

Pendekatan yang paling mudah adalah dengan memanfaatkan lapisan sistem file untuk mengubah nama file. Sejak Ubuntu 12.04, ada sistem file FUSE yang mengubah nama file menjadi nama yang didukung oleh VFAT Windows: fuse-posixovl Instal fuse-posixovl .

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

Atau untuk menghindari memerlukan akses root:

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

Karakter dalam nama file yang tidak diterima VFAT dikodekan sebagai di %(XX)mana XXdigit heksadesimal. Pada POSIXovl 1.2.20120215, berhati-hatilah bahwa nama file seperti %(3A)dikodekan sebagai dirinya sendiri, dan akan diterjemahkan sebagai :, sehingga ada risiko tabrakan jika Anda memiliki nama file yang mengandung substring formulir %(XX).

Berhati-hatilah karena POSIXovl tidak mengatasi nama file yang terlalu panjang. Jika nama yang disandikan tidak muat dalam 255 karakter, file tidak dapat disimpan.

POSIXovl menyimpan izin dan kepemilikan unix dalam file yang dipanggil .pxovl.FILENAME.


Bash ≥4 salinan skrip berikut ~/mail/foo:baruntuk /media/usb99/mail/foo_bar, dan juga untuk semua file di bawah ~/mail. File yang sudah ada di pohon tujuan dan yang tidak lebih tua dari sumber dilewati.

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

Skrip ini berfungsi di bawah zsh dengan modifikasi kecil: ganti shopt -s dotglob globstardengan setopt dot_globdan [[ $target -ot $source ]]oleh [[ ! -e $target || $target -ot $source ]].


Berikut ini adalah zsh two-liner (tiga jika Anda menghitung autoloads). Ini lebih pendek, tetapi cukup maju dan tidak terlalu mudah dibaca.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • The zargsgaris setara dengan mkdir -p ~/mail/**/*(…), kecuali bahwa ia tidak akan mengebom keluar jika panjang kumulatif dari nama direktori terlalu panjang. Baris itu menciptakan direktori target seperlunya.
  • ~/mail/**/*(/)memperluas ke semua direktori di bawah ~/mail(direktori hanya karena (/)pada akhir).
  • (/e\''…'\')hanya memilih direktori dan selanjutnya mengeksekusi kode dalam '...' untuk mengubah setiap nama file, yang disimpan dalam REPLYvariabel.
  • ${${REPLY#$HOME/}//:/_}menghapus awalan yang sesuai dengan direktori sumber dan mengubahnya :menjadi _.
  • zmv -C menyalin setiap file yang cocok dengan operan pertamanya (pola zsh) ke nama file yang diperoleh dengan memperluas operan keduanya.
  • -o -pumengatakan untuk meneruskan -puke cputilitas, sehingga dapat mempertahankan izin dan hanya menyalin file yang diperbarui. (Kami dapat memberi tahu zsh untuk melakukan pemeriksaan pembaruan; itu akan menjadi sedikit lebih cepat tetapi bahkan lebih samar.)
  • (.)hanya memilih file biasa. -Qmengatakan bahwa ini harus diurai sebagai kualifikasi glob dan bukan sebagai .dengan tanda kurung di sekitarnya yang menunjukkan subekspresi.
  • $1dan $2dalam teks pengganti cocok dengan tanda kurung (**/)dan *. ( **kehilangan arti khusus sebagai nol atau lebih tingkat subdirektori jika dalam tanda kurung, kecuali tanda kurung mengandung persis **/.)

Saya awalnya berpikir untuk menggunakan pax , yang merupakan alat pengarsipan (di sini dimaksudkan untuk digunakan dalam mode pass-through) yang memiliki fitur pengubahan nama file ( -sopsinya). Namun, opsi -sdan -utidak bekerja bersama-sama ( definisi POSIX dari pax secara harfiah mengatakan bahwa -uharus memeriksa file dengan nama yang sama di pohon tujuan, daripada nama file yang diubah oleh -s; implementasi pax di Ubuntu mengikuti spesifikasi secara harfiah daripada berguna). Masih mungkin untuk memanfaatkannya untuk membuat tautan keras yang diganti namanya, dan kemudian menyalin tautan keras itu (dengan rsync -auatau pax -rw -pp -u) ke media lain, tetapi rasanya lebih banyak masalah daripada nilainya.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya akan mencoba menggunakan pax. Mungkin Anda bisa meningkatkan jawaban Anda dengan menentukan paket yang dibutuhkan di ubuntu. Tampaknya tidak menjadi bagian dari instalasi normal.
Guillaume Coté
Hanya menambahkan satu paket yang disebut pax membuatnya berfungsi.
Guillaume Coté
Tidak menghasilkan apa-apa, saya mencoba menambahkan opsi -v untuk melihat apa yang terjadi. Tampaknya menyalin segala sesuatu dari waktu ke waktu. Maksud dari rsync adalah menjadi incremental, yang membuat saya menghemat banyak waktu ketika saya hanya memiliki beberapa file yang dimodifikasi di tengah banyak file.
Guillaume Coté
Tampaknya membuat direktori 'home' di bawah jalur yang saya tentukan. Dianjurkan untuk menghindari mengubah direktori dalam skrip, apakah ada kemungkinan lain untuk menghindari pembuatan semua direktori tersebut?
Guillaume Coté
Butuh lima menit pada umpan kedua di mana semuanya identik. rsync hanya perlu beberapa detik. Apakah ada opsi yang perlu ditentukan untuk membuatnya menjadi tambahan?
Guillaume Coté
-1

Apa yang saya lakukan dengan memory stick USB dan disk USB seluler adalah mempartisi mereka dengan 2 partisi: yang FAT32 dan yang ext4. Yang pertama dapat saya gunakan untuk bertukar data dengan pengguna non-linux, yang kedua untuk penggunaan pribadi saya dengan sistem Ubuntu saya (dan mungkin untuk bertukar dengan pengguna linux lainnya). Pada partisi ext4, Anda tidak akan memiliki masalah ":".

JanC
sumber
Saya ingin cadangan saya dapat dibaca di mana saja jika saya memerlukan informasi di komputer windows. Jika tidak, saya akan memformat ulang kunci usb ke sistem file unix. Itu sebabnya saya bertanya tentang substitusi.
Guillaume Coté
Yah, itu adalah mungkin untuk membaca setidaknya ext2 / ext3 pada Windows jika Anda menginstal beberapa alat atau driver filesystem. Apakah Anda ingin dapat membacanya di setiap sistem Windows, atau hanya di sistem Anda sendiri (di mana Anda dapat menginstal alat yang diperlukan jika Anda membutuhkannya)?
JanC
BTW: secara teori seharusnya menyimpannya di sistem NTFS juga, tetapi sebagian besar aplikasi Windows (termasuk sebagian besar dari Microsoft) tidak mendukung NTFS dengan benar ...: P
JanC
Ini adalah cadangan pemulihan kasus terburuk, jadi saya ingin bersiap untuk kasus ini ketika saya membutuhkan sesuatu yang cepat. Saya tidak punya hak untuk menginstal apa pun di komputer.
Guillaume Coté
-2

Anda bisa menggunakan taruntuk membuat arsip. Dengan cara ini Anda tidak perlu mengubah nama dan dapat menyimpannya ke sistem file apa pun yang Anda inginkan.

David
sumber
Saya bisa melakukan hal yang sama dengan file zip atau tgz, tetapi itu akan menulis ulang file yang tidak berubah setiap kali. Karena media sebagai jumlah terbatas menulis dan saya mendapatkan beberapa Gib data, saya ingin menghindari menulis ulang semuanya hanya karena file 1kb baru ditambahkan.
Guillaume Coté
Penulisan ulang pada memori flash baru-baru ini "terbatas" untuk beberapa juta atau setidaknya ratusan ribu biasanya. Saya ragu Anda berencana untuk membuat banyak cadangan. ;)
JanC
2
-1 -azv tidak membuat arsip, itu membuat salinan mode arsip yang artinya mempertahankan atribut file
João Pinto
sry, benar-benar berpikir rsync bisa melakukan itu, berubah menjadi tar, tapi saya tidak tahu apakah tar dapat melakukan backup tambahan. Namun JanC benar dan penulisan ulang seharusnya tidak menjadi masalah.
david
Mengenai komentar JanC tentang penulisan ulang, bukan hanya fakta bahwa ada batasan (terakhir kali saya memeriksa, itu lebih dekat ke seribu satu juta), tetapi juga fakta bahwa saya tidak suka menunggu beberapa jam untuk sesuatu yang harus kurang dari satu menit.
Guillaume Coté