มีวิธีที่จะแสดง: - ลิงก์ - หรือถอยกลับสำเนาสามัญใน cp (จาก coreutils GNU)?


11

มีวิธีที่จะบอกcpไป--link(เช่นสร้างการเชื่อมโยงยาก) แต่ถอยกลับในกรณีที่ฉันกำลังพยายาม hardlinks ระหว่างอุปกรณ์? ลิงก์ระหว่างอุปกรณ์เป็นไปไม่ได้และอาจทำให้เกิดความcpล้มเหลว

เหตุผลที่ฉันถามคือเพราะฉันต้องการใช้สิ่งนี้ในGNUmakefileและต้องการบรรทัดคำสั่งที่อ่านได้มากกว่าหนึ่งที่ซับซ้อนและยาว (หรือฟังก์ชั่นสำหรับเรื่องนั้น)

คำถามสำหรับ GNU coreutils (7.4 และ 8.13)

หมายเหตุ: ตอนนี้การแก้ปัญหาจะเป็นเช่น (GNU ทำไวยากรณ์สูตร):

cp -fl $^ $@ || cp -f $^ $@

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

คำตอบ:


8

cpไม่มีตัวเลือกนี้ คุณสามารถเขียนสคริปต์ wrapper แต่มันค่อนข้างง่าย

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5 แนะนำ--reflinkตัวเลือกนี้ หากคุณผ่าน--reflink=autoและระบบไฟล์พื้นฐานรองรับการคัดลอกเมื่อเขียน (เช่น Btrfs หรือ ZFS) และการคัดลอกที่เกิดขึ้นจะอยู่ในอุปกรณ์เดียวกันจากนั้นcpจะสร้าง inode ใหม่ แต่ไม่คัดลอกเนื้อหา มิฉะนั้นจะcpทำสำเนาตามปกติ นี่ยังไม่เป็นการเชื่อมโยงที่ยาก (เป้าหมายจะเป็น inode ที่แตกต่างกันเสมอ) แต่มันอาจจะดีกว่าสำหรับกรณีการใช้งานของคุณ อย่างไรก็ตามหากคุณใช้ ext4 (เหมือนคนส่วนใหญ่ทุกวันนี้) ซึ่งไม่สนับสนุนการคัดลอกเมื่อเขียนสิ่งนี้จะไม่ช่วยคุณ


1
ขอบคุณคู่$$ในกรณีของฉันแน่นอนเพราะนี่คือภายในแมโคร และแน่นอนว่าสายของคุณเป็นรูปแบบของสิ่งที่ฉันใช้ แต่อย่างน้อยฉันก็รู้วิธีนี้ว่ามันไม่ได้มีอยู่ในตัวเลือกและฉันต้องให้ตัวเอง
0xC0000022L

1
@ 0xC0000022L ในอีกไม่กี่ปีข้างหน้าเมื่อ btrfs แทนที่ ext4 คุณอาจต้องการใช้เรื่องที่สนใจlnและใช้cp --reflink=auto(ดูคำตอบที่อัปเดตของฉัน)
Gilles 'หยุดความชั่วร้าย'

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