ฉันใช้สคริปต์ทุบตีต่อไปนี้เพื่อคัดลอกเฉพาะไฟล์ที่มีนามสกุลบางไฟล์ (ในกรณีนี้คือ * .sh) แต่มันก็ยังคงคัดลอกไฟล์ทั้งหมด เป็นอะไรไป?
จาก = $ 1 ถึง = $ 2 rsync -zarv --include = "*. sh" $ จาก $ ถึง
ฉันใช้สคริปต์ทุบตีต่อไปนี้เพื่อคัดลอกเฉพาะไฟล์ที่มีนามสกุลบางไฟล์ (ในกรณีนี้คือ * .sh) แต่มันก็ยังคงคัดลอกไฟล์ทั้งหมด เป็นอะไรไป?
จาก = $ 1 ถึง = $ 2 rsync -zarv --include = "*. sh" $ จาก $ ถึง
rsync
สิ่งนี้สามารถทำได้ดีกับเชลล์ภายในหรือไม่?
คำตอบ:
ฉันคิดว่า--include
ใช้เพื่อรวมชุดย่อยของไฟล์ที่ถูกยกเว้นโดย--exclude
แทนที่จะรวมเฉพาะไฟล์เหล่านั้น ในคำอื่น ๆ : คุณต้องคิดเกี่ยวกับการรวมความหมายไม่ได้ยกเว้นไม่ได้ยกเว้น
ลองแทน:
rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"
สำหรับ rsync เวอร์ชัน 3.0.6 ขึ้นไปจำเป็นต้องแก้ไขลำดับดังนี้ (ดูความคิดเห็น):
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
การเพิ่ม-m
แฟล็กจะหลีกเลี่ยงการสร้างโครงสร้างไดเร็กทอรีว่างในปลายทาง ทดสอบในเวอร์ชัน 3.1.2
ดังนั้นถ้าเราเพียงต้องการไฟล์ .sh * เราต้องแยกไฟล์ทั้งหมด--exclude="*"
รวมถึงไดเรกทอรีทั้งหมดและรวมถึงไฟล์--include="*/"
.sh * ทั้งหมด--include="*.sh"
คุณสามารถดูตัวอย่างที่ดีได้ในส่วนรวม/ ไม่รวมกฎรูปแบบของหน้าคน
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
OP):
--include=\*.sh
แล้ว--exclude=\*
)
คำตอบโดย @chepner จะคัดลอกไดเร็กทอรีย่อยทั้งหมดโดยไม่คำนึงถึงความจริงว่ามีไฟล์หรือไม่ หากคุณต้องการยกเว้นไดเรกทอรีย่อยที่ไม่มีไฟล์และยังคงรักษาโครงสร้างไดเร็กทอรีไว้ให้ใช้
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
อีกอย่างหนึ่ง: หากคุณต้องการซิงค์ไฟล์ตามนามสกุลในdir เดียวเท่านั้น (โดยไม่มีการเรียกซ้ำ) คุณควรใช้โครงสร้างดังนี้:
rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/
--include
ให้ความสนใจของคุณเพื่อจุดในครั้งแรก--no-r
ไม่ทำงานในการก่อสร้างนี้
แก้ไข:
ขอบคุณ gbyte.co สำหรับความคิดเห็นที่มีค่า!
include
และexclude
อ็อพชันตามลำดับที่ระบุไว้นอกจากนี้จะหยุดที่ตัวเลือกแรกที่ตรงกัน ดังนั้นหากเราระบุ--exclude '*'
ที่แรกในตัวอย่างนี้ rsync จะไม่ทำอะไรเลย ดูชายคนนี้สำหรับคำอธิบายเพิ่มเติม
-- include './'
บอกรวมทุกอย่างในพา ธ ไดเร็กทอรีต้นทาง จากนั้นไฟล์ถัดไป "--include" .ext'` จะรวมไฟล์เฉพาะในเส้นทางต้นทางที่ตั้งชื่อ.ext
แล้วการยกเว้นระบุว่าอย่าส่งอะไรอีก--exclude '*'
? ถูกต้องหรือไม่
--include '*.ext'
และไม่--include '.ext'
นี่คือส่วนสำคัญจากหน้าคน:
เนื่องจากรายการไฟล์ / ไดเร็กทอรีที่จะโอนถูกสร้างขึ้น rsync จะตรวจสอบชื่อแต่ละชื่อที่จะโอนเทียบกับรายการของรูปแบบรวม / ไม่รวมในทางกลับกันและรูปแบบการจับคู่แรกจะถูกดำเนินการ: ถ้าเป็นรูปแบบการยกเว้นไฟล์นั้นจะเป็น ข้าม; หากเป็นรูปแบบการรวมชื่อไฟล์นั้นจะไม่ถูกข้าม หากไม่พบรูปแบบที่ตรงกันจะไม่มีการข้ามชื่อไฟล์
สรุป:
นอกจากนี้สิ่งที่ลงท้ายด้วยเครื่องหมายทับคือการจับคู่ไดเรกทอรี (เช่น find -type d
)
ลองแยกคำตอบนี้ออกจากด้านบน
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
ไฟล์สุดท้ายนี้--prune-empty-directories
จะป้องกันไม่ให้กฎข้อแรกสร้างไดเร็กทอรีว่างทั่วทุกที่
หากมีคนค้นหาสิ่งนี้ ... ฉันต้องการ rsync เฉพาะไฟล์และโฟลเดอร์ที่ต้องการและจัดการได้ด้วยคำสั่งนี้: rsync --include-from=rsync-files
ด้วยไฟล์ rsync:
my-dir/
my-file.txt
- /*
เขียนฟังก์ชันที่มีประโยชน์นี้และใส่สคริปต์ทุบตีของฉันหรือ~/.bash_aliases
. ทดสอบการซิงค์ในเครื่องบน Linux ด้วย bash และawk
ติดตั้ง มันได้ผล
selrsync(){
# selective rsync to sync only certain filetypes;
# based on: https://stackoverflow.com/a/11111793/588867
# Example: selrsync 'tsv,csv' ./source ./target --dry-run
types="$1"; shift; #accepts comma separated list of types. Must be the first argument.
includes=$(echo $types| awk -F',' \
'BEGIN{OFS=" ";}
{
for (i = 1; i <= NF; i++ ) { if (length($i) > 0) $i="--include=*."$i; } print
}')
restargs="$@"
echo Command: rsync -avz --prune-empty-dirs --include="*/" $includes --exclude="*" "$restargs"
eval rsync -avz --prune-empty-dirs --include="*/" "$includes" --exclude="*" $restargs
}
สั้นสะดวกและขยายได้เมื่อต้องการเพิ่มอาร์กิวเมนต์ (เช่น --dry-run
)
selrsync 'tsv,csv' ./source ./target --dry-run