Làm cách nào tôi có thể thay thế dấu hai chấm khi tôi rsync trên khóa USB?


12

Tôi muốn sao lưu thư mục thư của mình trên khóa USB. Tuy nhiên, IMAP của tôi có một quy ước đặt tên lạ rằng một cái gì đó bao gồm ký tự dấu hai chấm (:). Vì USB ở định dạng cửa sổ, rsync không thể tạo các tệp đó. Có cách nào để thay thế ký tự dấu hai chấm bằng dấu gạch dưới khi chạy rsync không? (Hoặc để thực hiện đồng bộ hóa tương tự với một công cụ khác?)

Chỉ cần một vài điểm mà tôi đã làm rõ trong các ý kiến:

  • Đây là một bản sao lưu trường hợp xấu nhất , tôi muốn có thể đọc nó trên máy Windows mà không cần cài đặt bất cứ thứ gì.
  • Tôi nhận được rất nhiều dữ liệu không đổi. Vì vậy, tôi tiết kiệm rất nhiều thời gian nếu tôi có một công cụ chỉ sao chép các tệp mới hơn.
  • Tôi không tìm kiếm một bản viết lại của rsync. Tôi đang tìm kiếm một công cụ hiện có có thể được sử dụng ngoài hộp.

Cảm ơn

Câu trả lời:


8

Sử dụng sao lưu dự phòng thay vì rsync đơn giản. Nó sẽ tự động phát hiện và thay thế cho các ký tự không được hỗ trợ trên đĩa đích và cũng đưa chúng trở lại như khi bạn khôi phục hệ thống tập tin unix. Nó tạo ra một thư mục được giải nén trông giống như bản gốc cộng với một thư mục siêu dữ liệu bổ sung.


6

Cách tiếp cận đơn giản nhất là tận dụng lớp hệ thống tập tin để chuyển đổi tên tệp. Kể từ Ubuntu 12.04, có một hệ thống tệp FUSE chuyển đổi tên tệp thành tên mà VFAT của Windows hỗ trợ: fuse-posixovl Cài đặt cầu chì-posixovl .

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

Hoặc để tránh yêu cầu quyền truy cập root:

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

Ký tự trong tên tập tin đó VFAT không chấp nhận được mã hóa như %(XX)nơi XXlà hexadecimal chữ số. Kể từ POSIXovl 1.2.20120215, hãy cẩn thận rằng tên tệp giống như %(3A)được mã hóa và sẽ được giải mã :, do đó, có nguy cơ xảy ra xung đột nếu bạn có tên tệp chứa chuỗi con của biểu mẫu %(XX).

Coi chừng POSIXovl không đối phó với tên tệp quá dài. Nếu tên được mã hóa không khớp với 255 ký tự, tệp không thể được lưu trữ.

POSIXovl lưu trữ các quyền unix và quyền sở hữu trong các tệp được gọi .pxovl.FILENAME.


Các bash sau ≥4 bản sao kịch bản ~/mail/foo:barđể /media/usb99/mail/foo_bar, và tương tự cho tất cả các file dưới ~/mail. Các tệp đã tồn tại trong cây đích và không cũ hơn nguồn được bỏ qua.

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

Kịch bản này hoạt động theo zsh với các sửa đổi nhỏ: thay thế shopt -s dotglob globstarbằng setopt dot_glob[[ $target -ot $source ]]bởi [[ ! -e $target || $target -ot $source ]].


Đây là một lớp lót hai lớp zsh (ba nếu bạn đếm số lần tự động tải). Nó ngắn hơn, nhưng khá tiên tiến và không dễ đọc.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • Các zargsdòng là tương đương với mkdir -p ~/mail/**/*(…), ngoại trừ việc nó sẽ không đánh bom ra nếu chiều dài tích lũy trong những cái tên thư mục quá dài. Dòng đó tạo các thư mục đích khi cần thiết.
  • ~/mail/**/*(/)mở rộng đến tất cả các thư mục bên dưới ~/mail(chỉ thư mục do (/)ở cuối).
  • (/e\''…'\')chỉ chọn các thư mục và tiếp tục thực thi mã trong '' 'để chuyển đổi từng tên tệp được lưu trữ trong REPLYbiến.
  • ${${REPLY#$HOME/}//:/_}loại bỏ tiền tố tương ứng với thư mục nguồn và thay đổi :thành _.
  • zmv -C sao chép từng tệp khớp với toán hạng đầu tiên của nó (mẫu zsh) vào tên tệp thu được bằng cách mở rộng toán hạng thứ hai của nó.
  • -o -punói để chuyển -puđến cptiện ích, để giữ quyền và chỉ sao chép các tệp đã cập nhật. (Chúng tôi có thể yêu cầu zsh thực hiện kiểm tra cập nhật; nó sẽ nhanh hơn một chút nhưng thậm chí còn khó hiểu hơn.)
  • (.)chỉ chọn các tập tin thông thường. -Qnói rằng điều này sẽ được phân tích cú pháp như một vòng loại toàn cầu chứ không phải là .dấu ngoặc đơn xung quanh nó biểu thị một biểu thức con.
  • $1$2trong văn bản thay thế khớp với các biểu thức được ngoặc đơn (**/)*. ( **mất ý nghĩa đặc biệt của nó là 0 hoặc nhiều cấp thư mục con nếu nó nằm trong ngoặc đơn, trừ khi dấu ngoặc đơn chứa chính xác **/.)

Ban đầu tôi nghĩ sử dụng pax , một công cụ lưu trữ (ở đây dự định sẽ được sử dụng trong chế độ chuyển qua) có tính năng đổi tên tệp ( -stùy chọn của nó ). Tuy nhiên, các tùy chọn -s-ukhông hoạt động cùng nhau ( định nghĩa POSIX của pax theo nghĩa đen nói rằng -uphải kiểm tra một tệp cùng tên trong cây đích, thay vì tên tệp được chuyển đổi bởi -s; việc triển khai pax trong Ubuntu theo đúng nghĩa đen hơn là hữu ích). Vẫn có thể sử dụng nó để đổi tên các liên kết cứng và sau đó sao chép các liên kết cứng (có rsync -auhoặc pax -rw -pp -u) sang các phương tiện khác, nhưng nó cảm thấy rắc rối hơn giá trị của nó.

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

Tôi sẽ cố gắng sử dụng pax. Có lẽ bạn có thể cải thiện câu trả lời của mình bằng cách chỉ định gói cần thiết trên Ubuntu. Nó dường như không phải là một phần của cài đặt bình thường.
Guillaume Coté

Chỉ cần thêm một gói duy nhất được gọi là pax làm cho nó hoạt động.
Guillaume Coté

Nó không xuất ra bất cứ thứ gì, tôi cố gắng thêm tùy chọn -v để xem điều gì đang xảy ra. Nó dường như được sao chép mọi thứ qua mọi lúc. Quan điểm của rsync là tăng dần, điều này giúp tôi tiết kiệm rất nhiều thời gian khi tôi chỉ có một vài tệp sửa đổi ở giữa rất nhiều tệp.
Guillaume Coté

Dường như nó đang tạo một thư mục 'nhà' theo đường dẫn tôi đã chỉ định. Bạn nên tránh thay đổi thư mục trong tập lệnh, có khả năng nào khác để tránh việc tạo tất cả các thư mục đó không?
Guillaume Coté

Phải mất năm phút trên đường chuyền thứ hai, nơi mọi thứ đều giống hệt nhau. rsync sẽ chỉ mất một vài giây. Có một tùy chọn cần phải được chỉ định để làm cho nó gia tăng?
Guillaume Coté

-1

Những gì tôi làm với thẻ nhớ USB và đĩa USB di động là phân vùng chúng với 2 phân vùng: một FAT32 và một ext4. Cái đầu tiên tôi có thể sử dụng để trao đổi dữ liệu với người dùng không phải linux, cái thứ hai để sử dụng cá nhân với các hệ thống Ubuntu của tôi (và có thể để trao đổi với những người dùng linux khác). Trên phân vùng ext4, bạn sẽ không gặp vấn đề ":".


Tôi muốn bản sao lưu của mình có thể đọc được ở bất cứ đâu trong trường hợp tôi cần thông tin trên máy tính windows. Nếu không, tôi đã định dạng lại khóa usb thành một hệ thống tập tin unix. Đó là lý do tại sao tôi hỏi về sự thay thế.
Guillaume Coté

Vâng, đó có thể đọc ít nhất ext2 / ext3 trên Windows nếu bạn cài đặt một số công cụ hoặc trình điều khiển hệ thống tập tin. Bạn có muốn đọc nó trên mọi hệ thống Windows hay chỉ trên các hệ thống của riêng bạn (nơi bạn có thể cài đặt các công cụ cần thiết nếu bạn cần chúng)?
JanC

BTW: về lý thuyết cũng có thể lưu trữ nó trên hệ thống NTFS, nhưng hầu hết các ứng dụng Windows (bao gồm hầu hết từ Microsoft) không hỗ trợ NTFS chính xác ...: P
JanC

Đây là một bản sao lưu phục hồi trường hợp xấu nhất, vì vậy tôi muốn chuẩn bị cho trường hợp khi tôi cần một cái gì đó nhanh chóng, tôi không có quyền cài đặt bất cứ thứ gì trên máy tính.
Guillaume Coté

-2

Bạn có thể sử dụng tarđể tạo một kho lưu trữ. Bằng cách này, bạn không phải thay đổi tên và có thể lưu nó vào bất kỳ hệ thống tập tin nào bạn muốn.


Tôi có thể làm tương tự với tệp zip hoặc tgz, nhưng nó sẽ viết lại tệp không thay đổi mỗi lần. Vì phương tiện truyền thông với số lượng ghi hạn chế và tôi nhận được một vài Gib dữ liệu, tôi muốn tránh viết lại toàn bộ chỉ vì một tệp 1kb mới được thêm vào.
Guillaume Coté

Việc viết lại trên bộ nhớ flash gần đây bị "giới hạn" ở một số hàng triệu hoặc ít nhất là hàng trăm ngàn. Tôi nghi ngờ bạn có kế hoạch để thực hiện nhiều bản sao lưu. ;)
JanC

2
-1 -azv không tạo ra một kho lưu trữ, nó thực hiện một bản sao chế độ lưu trữ có nghĩa là nó duy trì các thuộc tính tệp
João Pinto

Sry, thực sự nghĩ rằng rsync có thể làm điều đó, đã đổi thành tar, nhưng tôi không biết liệu tar có thể thực hiện sao lưu gia tăng hay không. Tuy nhiên JanC đã đúng và viết lại không nên là một vấn đề.
david

Về những bình luận của JanC về việc viết lại, không chỉ có một giới hạn (lần trước tôi kiểm tra, nó gần hơn một ngàn mà một triệu), mà còn là việc tôi không muốn đợi vài giờ cho một cái gì đó nên ít hơn một phút
Guillaume Coté
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.