Pertanyaan Bagaimana saya bisa menggantikan titik dua ketika saya rsync pada kunci USB?


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

Hanya beberapa poin yang saya klarifikasi di komentar:

  • Ini adalah sebuah skenario terburuk cadangan, 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


11
2017-11-05 20:57


asal




Jawaban:


Menggunakan rdiff-backup bukannya 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 yang dibongkar yang terlihat seperti asal ditambah satu direktori metadata tambahan.


8
2017-11-23 23:46





Pendekatan yang paling mudah adalah memanfaatkan lapisan filesystem untuk mengubah nama file. Sejak Ubuntu 12.04, ada a SEKERING filesystem yang mengubah nama file menjadi nama yang didukung VFAT Windows: sekering-posixovl  Install fuse-posixovl.

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

Atau untuk menghindari membutuhkan akses root:

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

Karakter dalam nama file yang VFAT tidak menerima dikodekan sebagai %(XX) dimana XX adalah digit heksadesimal. Mulai dari POSIXovl 1.2.20120215, perhatikan bahwa nama file seperti %(3A) dikodekan sebagai dirinya sendiri, dan akan diterjemahkan sebagai :, jadi ada risiko tabrakan jika Anda memiliki nama file yang berisi substring formulir %(XX).

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

POSIXovl menyimpan izin unix dan kepemilikan dalam file bernama .pxovl.FILENAME.


Berikut bash ≥4 salinan skrip ~/mail/foo:bar untuk /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 yang 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 bekerja di bawah zsh dengan sedikit modifikasi: ganti shopt -s dotglob globstar oleh setopt dot_glob dan [[ $target -ot $source ]] oleh [[ ! -e $target || $target -ot $source ]].


Ini adalah zsh two-liner (tiga jika Anda menghitung autoload). Lebih pendek, tetapi cukup maju dan tidak 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//:/_}'
  • Itu zargs baris setara dengan mkdir -p ~/mail/**/*(…), kecuali bahwa itu tidak akan mengebom jika panjang kumulatif nama direktori terlalu panjang. Baris itu membuat direktori target seperlunya.
  • ~/mail/**/*(/) meluas ke semua direktori di bawah ~/mail (direktori hanya karena (/) pada akhirnya).
  • (/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 perubahan : ke _.
  • zmv -C menyalin setiap file yang cocok dengan operan pertama (pola zsh) ke nama file yang diperoleh dengan memperluas operand kedua.
  • -o -pu mengatakan untuk lulus -pu ke cp utilitas, sehingga dapat mempertahankan izin dan menyalin hanya file yang diperbarui. (Kita dapat memberi tahu zsh untuk melakukan pemeriksaan pembaruan; itu akan menjadi sedikit lebih cepat tetapi bahkan lebih samar.)
  • (.) hanya memilih file biasa. -Q mengatakan bahwa ini harus diurai sebagai kualifikasi glob dan bukan sebagai . dengan tanda kurung di sekitarnya menunjukkan subekspresi.
  • $1 dan $2 dalam teks pengganti cocok dengan ekspresi yang disisipkan (**/) dan *. (** kehilangan arti khususnya sebagai nol atau lebih tingkat subdirektori jika dalam tanda kurung, kecuali tanda kurung mengandung persis **/.)

Awalnya saya berpikir untuk menggunakannya pax, yang merupakan alat pengarsipan (Di sini dimaksudkan untuk digunakan dalam mode pass-through) yang memiliki fitur penggantian nama file (itu -s pilihan). Namun, itu -s dan -u pilihan tidak berfungsi bersama (the Definisi POSIX dari pax secara harfiah mengatakan itu -u harus 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 memungkinkan untuk menggunakannya untuk mengganti tautan keras, dan kemudian salin tautan keras (dengan rsync -au atau pax -rw -pp -u) ke media lain, tetapi terasa 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/

6
2017-11-06 14:52



Saya akan mencoba menggunakan pax. Mungkin Anda bisa meningkatkan jawaban Anda dengan menentukan paket yang dibutuhkan di ubuntu. Ini sepertinya bukan bagian dari instalasi normal. - Guillaume Coté
Hanya menambahkan satu paket yang disebut pax membuatnya bekerja. - Guillaume Coté
Itu tidak menghasilkan apa-apa, saya mencoba menambahkan opsi -v untuk melihat apa yang sedang terjadi. Tampaknya menyalin segala sesuatu dari waktu ke waktu. Titik rsync adalah menjadi inkremental, yang membuat saya menghemat banyak waktu ketika saya hanya memiliki beberapa file yang dimodifikasi di tengah banyak file. - Guillaume Coté
Tampaknya menciptakan direktori 'rumah' di bawah jalur yang saya tentukan. Disarankan untuk menghindari mengubah direktori dalam skrip, adakah kemungkinan lain untuk menghindari pembuatan semua direktori tersebut? - Guillaume Coté
Butuh waktu lima menit pada lintasan kedua di mana semuanya identik. rsync hanya membutuhkan waktu beberapa detik. Apakah ada opsi yang perlu ditentukan untuk membuatnya inkremental? - Guillaume Coté


Apa yang saya lakukan dengan stik memori USB dan disk USB mobile saya adalah partisi mereka dengan 2 partisi: satu FAT32 dan satu 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 ":".


-1
2017-11-05 22:17



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 aku s 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 pada sistem Anda sendiri (di mana Anda dapat menginstal alat yang diperlukan jika Anda membutuhkannya)? - JanC
BTW: dalam teori itu harus mungkin untuk menyimpannya pada 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 ketika saya membutuhkan sesuatu dengan cepat Saya tidak memiliki hak untuk menginstal sesuatu di komputer. - Guillaume Coté


Anda bisa menggunakannya tar untuk membuat arsip. Dengan cara ini Anda tidak perlu mengubah nama dan dapat menyimpannya ke filesystem apa pun yang Anda inginkan.


-2
2017-11-05 21:23



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