ฉันต้องการคัดลอกประมาณ 200 ไดเรกทอรี & ไดเรกทอรีย่อยจากที่หนึ่งไปอีกที่หนึ่ง แต่ฉันไม่ต้องการคัดลอกหลายพันไฟล์ภายในไดเรกทอรีเหล่านั้น ฉันอยู่บน Linux
หมายเหตุ: ฉันมีพื้นที่ไม่เพียงพอที่จะคัดลอกทุกอย่างจากนั้นลบไฟล์ทั้งหมด
ฉันต้องการคัดลอกประมาณ 200 ไดเรกทอรี & ไดเรกทอรีย่อยจากที่หนึ่งไปอีกที่หนึ่ง แต่ฉันไม่ต้องการคัดลอกหลายพันไฟล์ภายในไดเรกทอรีเหล่านั้น ฉันอยู่บน Linux
หมายเหตุ: ฉันมีพื้นที่ไม่เพียงพอที่จะคัดลอกทุกอย่างจากนั้นลบไฟล์ทั้งหมด
คำตอบ:
เพิ่งพบสิ่งนี้:
rsync -a -f"+ */" -f"- *" source/ destination/
http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
find some/dir -type d -print0 | rsync --files-from=/dev/stdin -0 ...
อีกวิธีคือด้วยfindและmkdir :
find SOURCE -type d -exec mkdir TARGET/{} \;
เพียงตรวจสอบให้แน่ใจว่าเป้าหมายมีอยู่แล้วหรือใช้ตัวเลือก -p ของ mkdir
คุณยังสามารถทำสิ่งต่อไปนี้
find inputdir -type d | cpio -pdumv destdir
พลังแห่งความเรียบง่าย;)
ในทำนองเดียวกันการใช้ (GNU) tar:
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
คุณไม่จำเป็นต้องใช้-print0
บนบรรทัดคำสั่ง find หรือ-0
บนบรรทัดคำสั่ง rsync ยกเว้นว่าคุณมีชื่อไฟล์ที่มีอักขระขึ้นบรรทัดใหม่ (ซึ่งเป็นไปได้ แต่ไม่น่าเป็นไปได้สูง) Tar (และ rsync และ cpio) อ่านชื่อไฟล์ทีละบรรทัด; การใช้ NULL terminator ส่วนใหญ่จะเป็นประโยชน์กับxargs
ซึ่งโดยปกติจะอ่านชื่อไฟล์ที่คั่นด้วยช่องว่าง (และดังนั้นจึงไม่จัดการไฟล์ / ไดเรกทอรีที่มีช่องว่างในชื่อของพวกเขาโดยไม่ต้อง-0
)
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
จะคัดลอกไฟล์ทั้งหมดด้วยฮาร์ดลิงก์ โครงสร้างเดียวกันสิทธิ์เดียวกัน (หมายเหตุ: ฮาร์ดลิงก์ดังนั้นจึงไม่มีการจัดเก็บข้อมูลสูญหาย)
ls -d * / @source: find -type d -print0> dirs.txt @destination: xargs -0 mkdir -p
สิ่งนี้จะทำให้ทั้งสองคำสั่งใช้ค่า null เป็นตัวคั่นแทนช่องว่าง โปรดทราบว่าลำดับของ -type d และ -print0 นั้นสำคัญ!
@source
และ@destination
เป็นตัวบ่งชี้ถึงผู้อ่าน แต่ถึงอย่างนั้นก็ไม่สามารถใช้งานได้
rsync -a --include='*/' --exclude='*' ${source} ${destination}
นี้