ฉันจะแทนที่โคลอนเมื่อฉัน rsync บนคีย์ USB ได้อย่างไร


12

ฉันต้องการสำรองข้อมูลไดเรกทอรีอีเมลของฉันในคีย์ USB อย่างไรก็ตาม IMAP ของฉันมีรูปแบบการตั้งชื่อแปลก ๆ ซึ่งมีบางอย่างรวมถึงเครื่องหมายโคลอน (:) ตัวอักษร เนื่องจาก USB อยู่ในรูปแบบหน้าต่าง rsync จึงไม่สามารถสร้างไฟล์เหล่านั้นได้ มีวิธีการแทนที่อักขระโคลอนโดยขีดล่างเมื่อใช้ rsync หรือไม่ (หรือจะทำข้อมูลให้ตรงกันเดียวกันกับเครื่องมืออื่น?)

เพียงไม่กี่จุดที่ฉันชี้แจงในความคิดเห็น:

  • นี่คือการสำรองสถานการณ์กรณีที่เลวร้ายที่สุดฉันต้องการที่จะอ่านบนเครื่อง windows โดยไม่ต้องติดตั้งอะไร
  • ฉันได้รับข้อมูลจำนวนมากที่คงที่ ดังนั้นฉันจะประหยัดเวลาได้มากถ้าฉันมีเครื่องมือที่เพิ่งคัดลอกไฟล์ที่ใหม่กว่า
  • ฉันไม่ได้มองหา rsync ฉันกำลังมองหาเครื่องมือที่มีอยู่ที่สามารถใช้งานได้นอกกรอบ

ขอบคุณ

คำตอบ:


8

ใช้rdiff-backupแทน rsync ธรรมดา มันจะตรวจจับและแทนที่อักขระที่ไม่ได้รับการสนับสนุนบนดิสก์ปลายทางโดยอัตโนมัติและนำกลับมาเหมือนที่เคยใช้เมื่อคุณกู้คืนระบบไฟล์ยูนิกซ์ มันสร้างไดเรกทอรีที่แตกไฟล์ซึ่งมีลักษณะเหมือนกับที่มาพร้อมกับไดเรกทอรีเมตาดาต้าพิเศษอีกหนึ่งตัว


6

วิธีที่ตรงไปตรงมาที่สุดคือใช้ประโยชน์จากเลเยอร์ระบบไฟล์เพื่อแปลงชื่อไฟล์ ตั้งแต่ Ubuntu 12.04 มีFUSEระบบแฟ้มที่ชื่อแปลงไฟล์ลงในชื่อว่า Windows ของ VFAT สนับสนุน: ฟิวส์ posixovl ติดตั้ง fuse-posixovl

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

หรือเพื่อหลีกเลี่ยงการต้องการการเข้าถึงรูต:

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

อักขระในชื่อไฟล์ที่ VFAT ไม่ยอมรับจะถูกเข้ารหัสเหมือนกับ%(XX)ที่XXเป็นเลขฐานสิบหก ในฐานะของ POSIXovl 1.2.20120215 ระวังว่าชื่อไฟล์เหมือน%(3A)จะถูกเข้ารหัสเป็นตัวเองและจะได้รับการถอดรหัสเป็นจึงมีความเสี่ยงของการปะทะกันถ้าคุณมีชื่อไฟล์ที่มีสตริงของแบบฟอร์ม:%(XX)

ระวังว่า POSIXovl จะไม่รองรับชื่อไฟล์ที่ยาวเกินไป หากชื่อที่เข้ารหัสไม่พอดี 255 ตัวอักษรไฟล์นั้นจะไม่สามารถจัดเก็บได้

POSIXovl .pxovl.FILENAMEเก็บสิทธิ์ยูนิกซ์และความเป็นเจ้าของในไฟล์ที่เรียกว่า


ทุบตีต่อไป≥4สำเนาสคริปต์~/mail/foo:barไปและในทำนองเดียวกันสำหรับไฟล์ทั้งหมดภายใต้/media/usb99/mail/foo_bar ~/mailไฟล์ที่มีอยู่แล้วในแผนผังปลายทางและที่ไม่เก่ากว่าต้นทางจะถูกข้าม

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

สคริปต์นี้ทำงานภายใต้ zsh มีการปรับเปลี่ยนเล็กน้อย: แทนที่shopt -s dotglob globstarโดยsetopt dot_globและโดย[[ $target -ot $source ]][[ ! -e $target || $target -ot $source ]]


นี่คือ zsh สองซับ (สามถ้าคุณนับการแปลอัตโนมัติ) มันสั้นกว่า แต่ค่อนข้างสูงและไม่สามารถอ่านได้มาก

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • zargsบรรทัดจะเทียบเท่ากับการmkdir -p ~/mail/**/*(…)ยกเว้นว่ามันจะไม่ระเบิดออกถ้าความยาวของสะสมของชื่อไดเรกทอรียาวเกินไป บรรทัดนั้นสร้างไดเรกทอรีเป้าหมายตามความจำเป็น
  • ~/mail/**/*(/)ขยายไปยังไดเรกทอรีทั้งหมดภายใต้~/mail(ไดเรกทอรีเท่านั้นเนื่องจาก(/)ในตอนท้าย)
  • (/e\''…'\')เลือกเฉพาะไดเรกทอรีและเรียกใช้งานโค้ดเพิ่มเติมภายใน '... ' เพื่อแปลงชื่อไฟล์แต่ละไฟล์ซึ่งเก็บไว้ในREPLYตัวแปร
  • ${${REPLY#$HOME/}//:/_}เอาคำนำหน้าสอดคล้องกับไดเรกทอรีแหล่งที่มาและการเปลี่ยนแปลงเข้าสู่:_
  • zmv -C คัดลอกแต่ละไฟล์ที่ตรงกับตัวถูกดำเนินการแรก (รูปแบบ zsh) ไปยังชื่อไฟล์ที่ได้รับโดยการขยายตัวถูกดำเนินการที่สอง
  • -o -puบอกว่าจะส่งผ่าน-puไปยังcpยูทิลิตี้เพื่อรักษาสิทธิ์และคัดลอกเฉพาะไฟล์ที่อัปเดต (เราสามารถบอก zsh ให้ทำการตรวจสอบการอัปเดตมันจะเร็วขึ้นเล็กน้อย แต่เป็นความลับยิ่งขึ้น)
  • (.)เลือกไฟล์ปกติเท่านั้น -Qบอกว่านี่คือการแยกวิเคราะห์เป็นรอบคัดเลือกและไม่เหมือนกับ.วงเล็บล้อมรอบมันแสดง subexpression
  • $1และ$2ในข้อความเปลี่ยนให้ตรงกับการแสดงออกวงเล็บและ(**/) *( **สูญเสียความหมายพิเศษในระดับศูนย์หรือมากกว่านั้นไดเรกทอรีย่อยหากอยู่ในวงเล็บยกเว้นในวงเล็บมี**/ทุกประการ)

ตอนแรกฉันคิดว่าจะใช้paxซึ่งเป็นเครื่องมือเก็บถาวร (ที่นี่มีวัตถุประสงค์เพื่อใช้ในโหมด pass-through) ที่มีคุณสมบัติการเปลี่ยนชื่อไฟล์ ( -sตัวเลือก) อย่างไรก็ตามตัวเลือก-sและ-uทำงานร่วมกันไม่ได้ ( คำนิยาม POSIX ของ paxบอกว่า-uต้องตรวจสอบไฟล์ที่มีชื่อเดียวกันในแผนผังปลายทางมากกว่าที่จะเปลี่ยนชื่อไฟล์โดย-sการใช้ pax ใน Ubuntu ตามสเป็คมากกว่า ประโยชน์) ยังคงเป็นไปได้ที่จะใช้ประโยชน์จากมันเพื่อสร้างฮาร์ดลิงก์ที่ถูกเปลี่ยนชื่อแล้วคัดลอกฮาร์ดลิงก์ (พร้อมrsync -auหรือpax -rw -pp -u) ไปยังสื่ออื่น ๆ แต่มันก็รู้สึกลำบากมากกว่าที่ควรค่า

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

ฉันจะพยายามใช้สันติภาพ บางทีคุณสามารถปรับปรุงคำตอบของคุณโดยการระบุแพคเกจที่จำเป็นในอูบุนตู ดูเหมือนจะไม่ได้เป็นส่วนหนึ่งของการติดตั้งปกติ
Guillaume Coté

เพียงแค่เพิ่มแพ็คเกจเดียวที่เรียกว่า pax ทำให้มันใช้งานได้
Guillaume Coté

มันไม่เอาท์พุทอะไรเลยฉันพยายามเพิ่มตัวเลือก -v เพื่อดูว่าเกิดอะไรขึ้น ดูเหมือนว่าจะคัดลอกทุกอย่างไปทุกครั้ง ประเด็นของ rsync คือการเพิ่มขึ้นซึ่งทำให้ฉันประหยัดเวลาได้มากเมื่อฉันเพิ่งมีไฟล์ที่แก้ไขไม่กี่ไฟล์ที่อยู่ตรงกลางของไฟล์จำนวนมาก
Guillaume Coté

ดูเหมือนว่าจะสร้างไดเรกทอรี 'home' ใต้เส้นทางที่ฉันระบุ แนะนำให้หลีกเลี่ยงการเปลี่ยนไดเรกทอรีในสคริปต์มีความเป็นไปได้อีกอย่างที่จะหลีกเลี่ยงการสร้างไดเรกทอรีเหล่านั้นทั้งหมดหรือไม่
Guillaume Coté

ใช้เวลาห้านาทีในการผ่านครั้งที่สองซึ่งทุกอย่างเหมือนกัน rsync จะใช้เวลาเพียงไม่กี่วินาที มีตัวเลือกที่ต้องระบุเพื่อเพิ่มหรือไม่?
Guillaume Coté

-1

สิ่งที่ฉันทำกับหน่วยความจำ USB และดิสก์ USB มือถือของฉันคือพาร์ติชันที่มีพาร์ติชัน 2 พาร์ติชัน: FAT32 หนึ่งและ ext4 หนึ่ง คนแรกที่ฉันสามารถใช้เพื่อแลกเปลี่ยนข้อมูลกับผู้ใช้ที่ไม่ใช่ linux คนที่สองสำหรับการใช้ส่วนตัวกับระบบ Ubuntu ของฉัน (และอาจจะแลกเปลี่ยนกับผู้ใช้ linux คนอื่น) บนพาร์ติชัน ext4 คุณจะไม่มีปัญหา ":"


ฉันต้องการให้การสำรองข้อมูลของฉันสามารถอ่านได้ทุกที่ในกรณีที่ฉันต้องการข้อมูลบนคอมพิวเตอร์ที่ใช้ windows ถ้าไม่ฉันจะฟอร์แมตคีย์ usb ไปเป็นระบบไฟล์ยูนิกซ์ นั่นเป็นเหตุผลที่ฉันถามเกี่ยวกับการทดแทน
Guillaume Coté

ดีก็เป็นไปได้ที่จะอ่านอย่างน้อย ext2 / ext3 บน Windows หากคุณติดตั้งเครื่องมือบางอย่างหรือไดรเวอร์ระบบแฟ้ม คุณต้องการที่จะอ่านมันในทุกระบบ Windows หรือเฉพาะในระบบของคุณเอง (ซึ่งคุณสามารถติดตั้งเครื่องมือที่จำเป็นหากคุณต้องการ)
JanC

BTW: ตามทฤษฎีแล้วมันควรจะเป็นไปได้ที่จะเก็บไว้ในระบบ NTFS ด้วย แต่แอพพลิเคชั่น Windows ส่วนใหญ่ (รวมถึง Microsoft ส่วนใหญ่) ไม่รองรับ NTFS อย่างถูกต้อง ... : P
JanC

มันเป็นการสำรองข้อมูลการกู้คืนกรณีที่เลวร้ายที่สุดดังนั้นฉันต้องการเตรียมพร้อมสำหรับกรณีเมื่อฉันต้องการบางสิ่งอย่างรวดเร็วฉันไม่มีสิทธิ์ติดตั้งอะไรบนคอมพิวเตอร์
Guillaume Coté

-2

คุณสามารถใช้tarเพื่อสร้างการเก็บถาวร วิธีนี้คุณไม่ต้องเปลี่ยนชื่อและสามารถบันทึกเป็นระบบไฟล์อะไรก็ได้ที่คุณต้องการ


ฉันสามารถทำเช่นเดียวกันกับไฟล์ zip หรือ tgz แต่มันจะเขียนไฟล์ที่ไม่ได้เปลี่ยนไปในแต่ละครั้ง เนื่องจากสื่อมีจำนวน จำกัด ในการเขียนและฉันได้รับข้อมูลจาก Gib หลายตัวฉันจึงต้องการหลีกเลี่ยงการเขียนซ้ำทั้งหมดเพราะไฟล์ 1kb ใหม่ถูกเพิ่มเข้ามา
Guillaume Coté

การเขียนใหม่ในหน่วยความจำแฟลชล่าสุดนั้น "ถูก จำกัด " เป็นจำนวนมากหรืออย่างน้อยก็นับแสน ฉันสงสัยว่าคุณวางแผนที่จะสำรองข้อมูลจำนวนมาก ;)
JanC

2
-1 -azv ไม่ได้สร้างการเก็บถาวรมันทำสำเนาโหมดการเก็บถาวรซึ่งหมายความว่าจะรักษาแอตทริบิวต์ของไฟล์
João Pinto

sry คิดว่า rsync สามารถทำได้เปลี่ยนเป็น tar แต่ฉันไม่รู้ว่า tar สามารถสำรองข้อมูลเพิ่มเติมได้หรือไม่ อย่างไรก็ตาม JanC นั้นถูกต้องและการเขียนใหม่ไม่น่าจะมีปัญหา
david

เกี่ยวกับความเห็นของ JanC เกี่ยวกับการเขียนซ้ำมันไม่ใช่แค่ความจริงที่ว่ามีขีด จำกัด (ครั้งสุดท้ายที่ฉันตรวจสอบมันใกล้ถึงหนึ่งพันล้านต่อหนึ่งล้านครั้ง) แต่ยังรวมถึงความจริงที่ว่าฉันไม่ชอบที่จะรอหลายชั่วโมง ควรน้อยกว่าหนึ่งนาที
Guillaume Coté
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.