rsync ที่แยกไดเรกทอรีไม่ทำงาน


34

ฉันกำลังใช้งาน Fedora 17 64 บิตและrsync --exclude=/home/ben/<dir>ไม่ทำงานอย่างที่คาดไว้

ฉันพยายามที่จะrsyncไดเรกทอรีบ้านของฉันไปยังไดรฟ์หัวแม่มือ แต่ฉันต้องการที่จะแยกไดเรกทอรีที่เก็บไฟล์แคชและสร้างไฟล์แน่นอน นี่คือคำสั่งที่ฉันใช้:

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

อย่างไรก็ตามเนื้อหาจาก~/buildและจะถูกคัดลอกโดย~/.ccache rsyncผมทำอะไรผิดหรือเปล่า?


1
ฉันคิดว่าการแยกรูปแบบไม่ทำงาน
Sören

คำตอบ:


37

rsyncกฎตัวกรองทั่วโลกเริ่มต้นด้วยการนำ/จะยึดกับรากของการถ่ายโอน การอ้างถึงจากส่วน "รวมถึง / ยกเว้นกฎรูปแบบ" ของหน้าคน:

หากรูปแบบเริ่มต้นด้วย / แล้วมันจะยึดกับจุดเฉพาะในลำดับชั้นของไฟล์มิฉะนั้นจะจับคู่กับจุดสิ้นสุดของชื่อพา ธ สิ่งนี้คล้ายกับ ^ ที่นำหน้าในนิพจน์ทั่วไป ดังนั้น "/ foo" จะตรงกับชื่อของ "foo" ที่ "root ของการถ่ายโอน" (สำหรับกฎสากล) หรือในไดเรกทอรีของไฟล์ผสาน (สำหรับกฎต่อไดเรกทอรี)

ในคำสั่งของคุณ ( rsync ... -arv /home/ben home-ben/) ไฟล์ที่ได้จะถูกโอนไปยัง/home/ben/foo home-ben/ben/fooรากของการถ่ายโอนและเส้นทางกรองที่ถูกต้องคือhome-ben /ben/fooดังนั้น,

  • เพื่อให้ตรงกับที่/home/ben/.ccacheคุณต้องการเส้นทางตัวกรองของ/ben/.ccache
  • เพื่อให้ตรงกับที่/home/ben/build/คุณต้องการเส้นทางตัวกรองของ/ben/build/

คำอธิบายรายละเอียดเพิ่มเติมสามารถพบได้ใน "ทอดสมอรวม / ไม่รวมรูปแบบ" ของหน้าคนrsync(1)


โปรดทราบว่าการลาออกจากผู้นำ/ไม่จำเป็นต้องเป็นสิ่งที่คุณต้องการ การอ้างอิงอีกครั้งจากส่วนหน้าคนเดียวกัน:

"foo" ที่ไม่มีเงื่อนไขจะตรงกับชื่อของ "foo" ที่ใดก็ได้ในทรีเนื่องจากอัลกอริทึมนั้นถูกนำมาใช้ซ้ำจากบนลงล่าง มันจะทำงานราวกับว่าแต่ละองค์ประกอบของเส้นทางได้รับการเปลี่ยนเป็นจุดสิ้นสุดของชื่อไฟล์ แม้แต่การย่อย "foo / foo" ที่ยังไม่ได้เก็บจะตรงกับจุดใด ๆ ในลำดับชั้นที่พบ "foo" ในไดเรกทอรีชื่อ "sub" ดูส่วนที่เกี่ยวกับ ANCHORING INCLUDE / EXCLUDE PATTERNS เพื่อดูวิธีการระบุรูปแบบที่ตรงกับรากของการถ่ายโอน

ดังนั้นรูปแบบของตัวกรองbuild/จะตรงกับที่ใดก็ได้สร้างไดเรกทอรีแม้/home/ben/home/ben/many/sub/directories/build/


2
รายละเอียดที่สำคัญคือสแลชนั้นสำคัญ หากคุณต่อท้ายสแลชที่ส่วนท้ายของไดเรกทอรีต้นทาง (rsync -a source / ปลายทาง) มันจะคัดลอกเนื้อหาของแหล่งข้อมูลมิฉะนั้นrsync -a source destinationคัดลอกไดเรกทอรีต้นทางเองไปยังปลายทาง สิ่งนี้จะกำหนดสิ่งที่รูทของการถ่ายโอนเพื่อแจ้งให้ทราบถึงนิพจน์ที่แยกออก การใช้งานที่เหมาะสมของ / ในนิพจน์ที่แยกออกจะถูกอธิบายไว้ด้านบน โปรดทราบว่าrsync --exclude='/dir1' source destinationจะไม่ยกเว้นสิ่งใด
pgoetz

11

ฉันคิดว่าexcludeเส้นทางของคุณต้องสัมพันธ์กับเส้นทางต้นทาง ลองทำแบบนี้แทนได้ไหม

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

นี่คือการทดสอบเพื่อเปรียบเทียบ:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
คำตอบนี้ผิด ด้วยเส้นทางที่ไม่รวมญาติคุณจะยกเว้นรูปแบบได้ทุกที่!
rubo77

โพสต์นี้ถูกต้อง การจับคู่เป็นข้อความไม่ใช่ไฟล์อิง inode เส้นทางใดก็ตามที่เอาต์พุตของ--verboseคำสั่งแสดงเป็นรูปแบบที่คุณต้องใช้
Sridhar Sarnobat

สิ่งนี้ใช้ได้สำหรับฉัน
Zhenyu

เกิดอะไรขึ้นถ้าเส้นทางที่มาคือ '/' ดังนั้นแน่นอนเป็นเส้นทางญาติ แต่ก็ยังไม่ทำงาน
Sören

นี่เป็นสิ่งเดียวที่ทำงานให้ฉัน
Jonathan

2

ฉันมีปัญหานี้ในสคริปต์ (ฉันไม่ทราบว่าเป็นกรณีของคุณ) ฉันเป็นเพราะฉันใช้คำสั่งนี้ในสคริปต์และฉันใช้ sh แทนทุบตี ตรวจสอบ shebang ที่จุดเริ่มต้นของสคริปต์ของคุณ


1

รูปแบบการยกเว้นของคุณจะใช้งานได้หากคุณซิงค์เส้นทางทั้งหมด / ที่บ้านเช่นไม่มีเครื่องหมายทับ:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

แต่จะดีกว่าเพียงซิงค์เนื้อหาของโฟลเดอร์ด้วยเครื่องหมายสแลชต่อท้าย:

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

คุณสามารถใช้รายการเพิกเฉยได้เช่นกันดู: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

ในการแยกโฟลเดอร์ specif ด้วย rsync คุณต้องพิจารณาพา ธ สัมพัทธ์ในคำสั่ง ในกรณีที่คุณ:

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

โดยที่ "ben" เป็นโฟลเดอร์ที่คุณกำลังทำการซิงค์

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