วิธียกเว้นไดเรกทอรีหลายรายการด้วย rsync


184

ฉันพยายามสำรองข้อมูลไดเรกทอรีบ้านโดยใช้ rsync และฉันต้องการแยกไดเรกทอรีที่มีขยะ ฉันต้องการที่จะยกเว้นเฉพาะและ/home/ben/.ccache /home/ben/buildน่าเสียดายที่เอกสารสำหรับ rsync นั้นมีข้อมูลมากเกินไปและไม่ได้ตอบคำถามของฉัน นี่คือสิ่งที่ฉันพยายาม:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


4
แค่อยากจะบอกว่าธงaนัยrแล้ว :)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

คำตอบ:


238

ตกลงฉันรู้สึกเป็นใบ้จริงๆ ก่อนที่ฉันจะโพสต์คำถามนี้เพื่อนของฉันแสดงให้ฉันเห็นวิธีการทำและมันง่ายมาก หากต้องการยกเว้นหลายไดเรกทอรีคุณเพียงแค่ใช้หลาย--exclude=pathสวิตช์ ดังนั้นคำสั่งของฉันด้านบนเขียนอย่างถูกต้องเป็นดังนี้:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/

7
พา ธ สัมบูรณ์ไม่ทำงานสำหรับฉัน (ไดเรกทอรีที่ระบุไม่ถูกแยกออกจากกันอย่างเงียบ ๆ ) ในขณะที่เส้นทางที่สัมพันธ์กับไดเรกทอรีต้นทางนั้นทำงานอย่างถูกต้อง บางทีฉันอาจจะพลาดบางสิ่งบางอย่าง แต่ฉันจะต้องระมัดระวังเกี่ยวกับการยืนยันของ @FreeSoftwareServers ว่าเส้นทางที่แน่นอนทำงานได้ตลอดเวลา
Soren Bjornstad

5
FYI: ตัวเลือก-aรวมถึง-rเพื่อให้-arซ้ำซ้อน
David

4
ตรงกันข้ามกับสิ่งที่ FreeSoftwareServers เชื่อว่าเส้นทางที่แยกนั้นสัมพันธ์กับเส้นทางต้นทางไม่ใช่ / ดังนั้นความคิดเห็นที่เป็นเท็จอย่างมีนัยสำคัญและจะนำไปสู่ความล้มเหลวหากคุณทำ กลยุทธ์ที่ดีที่สุดคือการละทิ้งผู้นำ / ในการแยกของคุณเพื่อหลีกเลี่ยงข้อผิดพลาดทางจิตประเภทนี้ หากแหล่งที่มาพูดว่า / home / me และหากคุณแยก = '/ mydir /' สิ่งนี้จะแยกไดเรกทอรี mydir ใน / home / me นั่นคือมันจะแยก / home / me / mydir NOT / mydir / at / เป็นเรื่องที่โชคร้ายที่ฉันไม่สามารถลงคะแนนหรือแก้ไขความคิดเห็นนั้นได้เนื่องจากเป็นเทคนิคที่ผิดและจะทำให้เข้าใจผิด
Lizardx

3
FYI สำหรับนักเดินทางในภายหลังดูเหมือนว่าความคิดเห็นที่เป็นปัญหาโดย @FreeSoftwareServer ถูกลบแล้ว tl; dr: ใช้เส้นทางสัมพัทธ์
Freedom_Ben

2
หากคุณเป็นคนโง่ฉันก็เป็นเช่นนั้นกับฉัน
Sridhar Sarnobat

108

เมื่อมีหลายไดเรกทอรีและ / หรือไฟล์ที่จะแยกให้สร้างไฟล์ข้อความและใช้--exclude-fromสวิตช์ ทำไฟล์ชื่อexclude_me.txtและในรายการการยกเว้นของคุณ ตัวอย่าง ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

จากนั้น rsync ของคุณจะมีลักษณะดังนี้:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

นี่คือข้อมูลบางอย่างเกี่ยวกับกฎตัวกรองที่อาจช่วยได้:

  • /dir/ หมายความว่าไม่รวมโฟลเดอร์รูท /dir
  • /dir/*หมายถึงรับโฟลเดอร์รูท/dirแต่ไม่ใช่เนื้อหา
  • dir/ หมายถึงไม่รวมโฟลเดอร์ใดก็ได้ที่มีชื่ออยู่ dir/

  • ตัวอย่างที่ยกเว้น: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfหมายถึงข้ามไฟล์ที่ขึ้นต้นด้วยcfภายในโฟลเดอร์ใด ๆ ภายใน/var/spool/lpd

ดูที่หมวดกฏตัวกรองในหน้า man


4
สิ่งสำคัญคือให้สังเกตว่าโฟลเดอร์รูทหมายถึงรูทของการถ่ายโอนไม่ใช่ไดเร็กทอรีรูท
jamesdlin

นี่คือคำตอบที่ยอดเยี่ยม!
Alexander Zhukov

85

คุณยังสามารถยกเว้นหลายเส้นทางภายในวงเล็บปีกกา:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/

40
งานนี้อย่างดีไม่ใช่แค่ภายใต้ sh เท่านั้นภายใต้ทุบตีฉันพบ "วิธีที่ยาก"
xor

7
ไม่มีช่องว่างหลังเครื่องหมายจุลภาค เรียนรู้ว่าวิธีที่ยากเกินไป😭
styl3r

และอย่าใช้ '' like --exclude = '. gvfs'
Martin T.

FWIW ฉันคิดว่าเหล็กดัดปีกนกใช้ได้กับ ksh สำหรับกระสุนอื่น ๆ คุณอาจใช้สิ่งIFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/ต่อไปนี้: หรือคุณสามารถใช้--excludeอาร์กิวเมนต์หลายข้อซึ่งคุณต้องพิมพ์ด้วยตนเอง
TSJNachos117

1
เหตุผลนี้เป็นผลมาจาก "การขยายรั้ง" ในกรณีที่ทุกคนต้องการดูรายละเอียด
shredalert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.