คัดลอกไฟล์ทุกไฟล์ในโครงสร้างไดเรกทอรีลงในพา ธ เฉพาะเมื่อไฟล์ไม่มีอยู่แล้ว


8

ต้องการคัดลอกทุกไฟล์จากโครงสร้างไดเรกทอรีไปยังไดเรกทอรีเฉพาะเมื่อไม่มีไฟล์อยู่แล้ว

มีส่วนแรกจากคำถาม Stack Overflow นี้ :

find . -type f -exec cp {} /target-directory \;

ฉันจะตรวจสอบว่าไฟล์นั้นมีอยู่หรือไม่? หากไม่มีให้คัดลอกไฟล์หรือข้ามไป


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

คำตอบ:


13

คุณสามารถใช้-uสวิตช์จากcpคำสั่ง:

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

หรือใช้rsyncคำสั่งด้วย--ignore-existing:

ข้ามการอัพเดตไฟล์ที่มีอยู่บนผู้รับ

ตัวอย่าง:

rsync --ignore-existing source/* destination/

3

คำสั่งดั้งเดิมของคุณสามารถเขียนใหม่เป็น:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

กุญแจสำคัญคือเราเรียกเชลล์ด้วยคำสั่งเฉพาะและส่งไฟล์ที่พบเป็น$1อาร์กิวเมนต์ หากtest -e /target-directory/"$1"ล้มเหลวนั่นหมายความว่าไม่มีไฟล์อยู่ในกรณีนี้cpจะคัดลอกไฟล์

โดยทั่วไปหนึ่งสามารถใช้คำสั่งอื่น ๆ ได้ตราบใดที่คำสั่งสามารถตรวจสอบการมีอยู่ของไฟล์ ทางเลือกอื่น ๆ :

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
ทำไมstatต้องทดสอบการมีอยู่ของไฟล์ใน Bash จะไม่test -eง่ายกว่านี้อีกหรือ
David Foerster

@DavidFoerster ไม่มีเหตุผลพิเศษ คำสั่งทดสอบจะทำเช่นกัน ฉันจะแก้ไขคำตอบของฉันในภายหลังถ้าฉันไม่ลืม
Sergiy Kolodyazhnyy

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