Linux วิธีคัดลอก แต่ไม่เขียนทับ?


385

ฉันต้องการcpไดเรกทอรี แต่ฉันไม่ต้องการเขียนทับไฟล์ที่มีอยู่ใด ๆ แม้ว่ามันจะเก่ากว่าไฟล์ที่ถูกคัดลอก และฉันต้องการทำแบบไม่โต้ตอบอย่างสมบูรณ์เพราะนี่จะเป็นส่วนหนึ่งของสคริปต์ Crontab Bash ความคิดใด ๆ


คำตอบ:


589

นำมาจากหน้าคน :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

ตัวอย่าง:

cp -n myoldfile.txt mycopiedfile.txt

32
หมายเหตุนี่จะออกโดยมีข้อผิดพลาดหากไฟล์มีอยู่ หากต้องการออกจากความสำเร็จให้ลอง cp -n source.txt destination.txt || true
galenandrew

13
@galenandrew cp -nไม่ออกโดยมีข้อผิดพลาดหากไฟล์นั้นมีอยู่ใน Ubuntu 12.04
amit

@galenandrew ยืนยันแล้ว ขอบคุณ. โครงการของฉันไม่ได้สร้างใน Xcode หลังจากเพิ่มสคริปต์เรียกใช้ลงในเป้าหมายของฉัน
รุยซ์

@AaronFranke ดูเหมือนว่าจะทำ
บอริส

93

rsyncพิจารณาใช้

rsync -a -v --ignore-existing src dst

ตามความคิดเห็นrsync -a -v src dstไม่ถูกต้องเพราะมันจะอัพเดทไฟล์ที่มีอยู่


7
คุณต้องการเพิ่มการ--ignore-existingตั้งค่าสถานะเพื่อป้องกันไฟล์ที่มีอยู่ถูกเขียนทับ
คนงานทุกคนมีความสำคัญ

7
คำสั่งที่สมบูรณ์rsync -a -v --ignore-existing <src> <dst>นั้นเป็นคำตอบที่ถูกต้องแทนที่จะเป็นcp -uด้านบน
Whitebird

หากการคัดลอกก่อนหน้าถูกขัดจังหวะและคัดลอกไฟล์ที่ถูกตัดทอนเท่านั้นฉันแน่ใจว่า cp -u จะไม่คัดลอกซ้ำ ... แต่ rsync จะมี - ที่มีอยู่เดิมหรือไม่ อาจจะไม่ใช่ ... อย่างนั้นแหละที่ทำให้มันเทียบเท่ากันใช่มั้ย
dagelf

rsync ช่วยให้การประทับเวลาไฟล์ในขณะที่ซีพีใช้เวลาปัจจุบัน (ในประสบการณ์ของฉัน)
สเตฟาน diabo

1
เซิร์ฟเวอร์บางตัวไม่มี rsync
mebada


33

สิ่งนี้จะใช้ได้กับ RedHat:

false | cp -i source destination 2>/dev/null

การอัปเดตและไม่เขียนทับเป็นสิ่งที่แตกต่าง


4
ที่falseนี่ทำอะไร
Frozen Flame

11
@FrozenFlame ตอบ-iคำถาม
เซเว่น

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

2
เห็นได้ชัดว่าคำสั่งนี้จะไม่ทำงานหากโลกตกลงไปในดวงอาทิตย์
เซเว่

32

สำหรับคนที่พบว่าไม่มีตัวเลือก 'n' (เช่นฉันใน RedHat) คุณสามารถใช้cp -uเพื่อเขียนไฟล์เท่านั้นหากแหล่งที่มานั้นใหม่กว่าตัวที่มีอยู่เดิม (หรือไม่มีตัวที่มีอยู่)

[แก้ไข] ดังที่กล่าวไว้ในความคิดเห็นสิ่งนี้จะเขียนทับไฟล์เก่ากว่าดังนั้นจึงไม่ตรงตามที่ OP ต้องการ ใช้คำตอบของ ceving สำหรับสิ่งนั้น


11
OP ขอให้ไม่เขียนทับไฟล์ที่มีอยู่แม้ว่าไฟล์นั้นจะเก่ากว่าไฟล์ที่คัดลอกดังนั้นจึง-uไม่ตรงกับวัตถุประสงค์ที่แท้จริง
Andrew Lott

4
ดีคุณพูดถูก ฉันประหลาดใจที่มันใช้เวลานานสำหรับทุกคนที่จะสังเกตเห็น
กลัว ...

อาจไม่ใช่สิ่งที่ OP ขอ แต่เป็นสิ่งที่ฉันต้องการสำหรับ Uberspace ของฉัน (Centos 7) ขอบคุณ!
โทมัสแพรกซ์

ฉันดีใจที่เมื่อหกปีที่แล้วฉันสามารถช่วย :-D
กลัว ...

10

linux อัลไพน์:คำตอบด้านล่างสำหรับกรณีของไฟล์เดียว: ในอัลไพน์cp -nไม่ทำงาน (และfalse | cp -i ...เกินไป) ดังนั้นวิธีแก้ปัญหาการทำงานในกรณีของฉันที่ฉันพบคือ:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

ในตัวอย่างข้างต้นถ้าenv.jsไฟล์ไม่ได้มีอยู่แล้วเราคัดลอกไปenv.example.jsenv.js


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