ฉันต้องการcp
ไดเรกทอรี แต่ฉันไม่ต้องการเขียนทับไฟล์ที่มีอยู่ใด ๆ แม้ว่ามันจะเก่ากว่าไฟล์ที่ถูกคัดลอก และฉันต้องการทำแบบไม่โต้ตอบอย่างสมบูรณ์เพราะนี่จะเป็นส่วนหนึ่งของสคริปต์ Crontab Bash ความคิดใด ๆ
ฉันต้องการcp
ไดเรกทอรี แต่ฉันไม่ต้องการเขียนทับไฟล์ที่มีอยู่ใด ๆ แม้ว่ามันจะเก่ากว่าไฟล์ที่ถูกคัดลอก และฉันต้องการทำแบบไม่โต้ตอบอย่างสมบูรณ์เพราะนี่จะเป็นส่วนหนึ่งของสคริปต์ Crontab Bash ความคิดใด ๆ
คำตอบ:
นำมาจากหน้าคน :
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
ตัวอย่าง:
cp -n myoldfile.txt mycopiedfile.txt
cp -n source.txt destination.txt || true
cp -n
ไม่ออกโดยมีข้อผิดพลาดหากไฟล์นั้นมีอยู่ใน Ubuntu 12.04
rsync
พิจารณาใช้
rsync -a -v --ignore-existing src dst
ตามความคิดเห็นrsync -a -v src dst
ไม่ถูกต้องเพราะมันจะอัพเดทไฟล์ที่มีอยู่
--ignore-existing
ตั้งค่าสถานะเพื่อป้องกันไฟล์ที่มีอยู่ถูกเขียนทับ
rsync -a -v --ignore-existing <src> <dst>
นั้นเป็นคำตอบที่ถูกต้องแทนที่จะเป็นcp -u
ด้านบน
สิ่งนี้จะใช้ได้กับ RedHat:
false | cp -i source destination 2>/dev/null
การอัปเดตและไม่เขียนทับเป็นสิ่งที่แตกต่าง
false
นี่ทำอะไร
-i
คำถาม
สำหรับคนที่พบว่าไม่มีตัวเลือก 'n' (เช่นฉันใน RedHat) คุณสามารถใช้cp -u
เพื่อเขียนไฟล์เท่านั้นหากแหล่งที่มานั้นใหม่กว่าตัวที่มีอยู่เดิม (หรือไม่มีตัวที่มีอยู่)
[แก้ไข] ดังที่กล่าวไว้ในความคิดเห็นสิ่งนี้จะเขียนทับไฟล์เก่ากว่าดังนั้นจึงไม่ตรงตามที่ OP ต้องการ ใช้คำตอบของ ceving สำหรับสิ่งนั้น
-u
ไม่ตรงกับวัตถุประสงค์ที่แท้จริง
linux อัลไพน์:คำตอบด้านล่างสำหรับกรณีของไฟล์เดียว: ในอัลไพน์cp -n
ไม่ทำงาน (และfalse | cp -i ...
เกินไป) ดังนั้นวิธีแก้ปัญหาการทำงานในกรณีของฉันที่ฉันพบคือ:
if [ ! -f env.js ]; then cp env.example.js env.js; fi
ในตัวอย่างข้างต้นถ้าenv.js
ไฟล์ไม่ได้มีอยู่แล้วเราคัดลอกไปenv.example.js
env.js
cp บางรุ่นไม่มีตัวเลือก- no-clobber ในกรณีนั้น:
echo n | cp -vipr src/* dst