คัดลอกไฟล์ใน Linux หลีกเลี่ยงการคัดลอกหากไฟล์มีอยู่ในปลายทาง


32

ฉันต้องการคัดลอกโฟลเดอร์ / home / user จากฮาร์ดดิสก์หนึ่งไปยังอีกโฟลเดอร์หนึ่ง มันมี 100,000 ไฟล์และขนาดประมาณ 10G

ฉันใช้

cp -r /origin /destination

บางครั้งฉันได้รับข้อผิดพลาดเนื่องจากลิงค์เสียสิทธิ์และอื่น ๆ ดังนั้นฉันจะแก้ไขข้อผิดพลาดและต้องเริ่มการคัดลอกอีกครั้ง

ฉันสงสัยว่าฉันจะบอกคำสั่ง "cp" ได้อย่างไรเมื่อพยายามคัดลอกอีกครั้งไม่คัดลอกไฟล์อีกครั้งหากมีอยู่ในโฟลเดอร์ปลายทาง


2
เราไม่ได้เป็นซีพี ใช้ rsync แทน
วิลเลียม Pursell

คำตอบ:


22

cp -R -u -p /source /destination

-u( หรือ--update ) ธงไม่เพียงแค่นี้

จาก man page สำหรับ cp:

-u, - อัปเดต

คัดลอกเฉพาะเมื่อไฟล์ SOURCE ใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป


6
หากต้องการคัดลอกเฉพาะไฟล์ที่ไม่มีอยู่จริงและไม่อัปเดตไฟล์ที่มีอยู่ yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, - อัปเดตคัดลอกเฉพาะเมื่อไฟล์ SOURCE ใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป -u, - อัปเดตคัดลอกเฉพาะเมื่อไฟล์ SOURCE ใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป -p เช่นเดียวกับ --preserve = โหมด, การเป็นเจ้าของ, การประทับเวลา --preserve [= ATTR_LIST] รักษาแอตทริบิวต์ที่ระบุไว้ (ค่าเริ่มต้น: โหมด, การเป็นเจ้าของ, การประทับเวลา) หากมีคุณสมบัติเพิ่มเติมที่เป็นไปได้: บริบทลิงก์ xattr ทั้งหมด
Covich

51

cp -n <source> <dest>ใช้เพียงแค่

จากหน้าคน :

-n, - ไม่อุดตัน

อย่าเขียนทับไฟล์ที่มีอยู่ (แทนที่ตัวเลือก -i ก่อนหน้า)


7
นี่เป็นคำตอบที่แท้จริงเพียงคำถามเดียว
sebix

20

rsync -aq /src /dest

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


ฉันไม่สามารถเพิ่ม `` การจัดรูปแบบในโพสต์ของคุณได้เพราะมีเพียงสองตัวอักษร คุณรู้สึกอย่างไรเกี่ยวกับการแก้ไขและเพิ่มอักขระ `` รอบคำสั่งของคุณ?
culix

4

ค้นหาตัวเลือก "-u" สำหรับcpคำสั่ง


2
ไม่เห็นด้วยว่าการใช้ -u เป็นความคิดที่ดี -u คัดลอกเฉพาะเมื่อแหล่งที่มาเป็นที่ใหม่กว่าหรือปลายทางหายไป ปัญหาของโปสเตอร์ดั้งเดิมนั้นเกิดจากการคัดลอกไฟล์ไม่ว่าด้วยเหตุผลใดก็ตาม OP จะมีไฟล์ที่เขียนครึ่งหนึ่งซึ่งไม่ได้อัปเดตเมื่อเรียกใช้สำเนาอีกครั้ง ไฟล์นั้นอาจมีความสำคัญสำหรับใครบางคน! rsync แก้ปัญหานี้ได้
hazymat

2

คำตอบข้างต้นทั้งหมดถูกต้อง แต่ถ้าคุณทำแบบนี้ซ้ำแล้วซ้ำอีก

คุณควรทำ:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

คุณควรคัดลอกเป็นรูทเพื่อรักษาสิทธิ์ / ความเป็นเจ้าของ

# cp -au

ดู rsync ด้วย


1

โซลูชัน POSIX

คำตอบอื่น ๆ ใช้-u หรือตัวเลือกของ-n cpเหล่านี้ไม่ถูกต้องตาม POSIX ; และrsyncมาจากคำตอบอื่น หรือyesใช้ในหนึ่งในความคิดเห็น

ถึงกระนั้นเราสามารถทำซ้ำได้yes nด้วยการwhileวนซ้ำ สิ่งนี้นำไปสู่โซลูชัน POSIX ต่อไปนี้:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

ใช้ cp -rn <sourcedirname>/. <destdirname>

สวิตช์ r ทำให้การคัดลอกซ้ำทั่วไดเรกทอรี

สวิตช์ n (รุ่นที่ไม่มีการอุดตันแบบยาว) ช่วยให้มั่นใจได้ว่าไฟล์ที่มีอยู่จะไม่ถูกเขียนทับ

' /.' ที่อยู่หลัง sourcedirname ทำให้แน่ใจว่าจะไม่กลายเป็นไดเรกทอรีย่อยภายใต้ชื่อปลายทางแทนเนื้อหาทั้งหมดของอดีตที่ถูกคัดลอกไปยังหลัง

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