ฉันจะคัดลอกไฟล์และสร้างไดเรกทอรีเป้าหมายพร้อมกันได้อย่างไร


20

ฉันต้องการที่cp aaa/deep/sea/blob.psdจะbbb/deep/sea/blob.psd

ฉันจะคัดลอกได้อย่างไรถ้าไม่มีไดเรกทอรีdeepและseaอยู่ภายใต้bbbเพื่อให้คัดลอกทั้งสองสร้างไดเรกทอรีที่จำเป็นและคัดลอกไฟล์?

ตอนนี้ฉันได้
No such file or directoryลึกและทะเลไม่อยู่

ฉันมองผ่านหน้าช่วยเหลือชายและคำถามอื่น ๆ แต่ไม่มีอะไรโดดออกมาที่ฉัน

สิ่งที่ฉันได้รับใกล้เคียงที่สุดคือใช้rcpสำหรับไดเรกทอรี:

rcp -r aaa/deep/sea/ bbb/deep/sea/

แม้ว่าจะเป็นการคัดลอกไดเรกทอรีและเนื้อหาทั้งหมดและฉันต้องการไฟล์เดียว พยายามทำเช่นนั้น แต่ให้cp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

คำตอบ:


19

ลองใช้ฟังก์ชั่นถัดไปสำหรับสถานการณ์เช่นนี้:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

และใช้มันเป็น

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

โดยวิธีการที่ GNU cpมี--parentsตัวเลือก มันใกล้เคียงกับสิ่งที่คุณต้องการจริงๆ แต่ไม่แน่นอน
มันจะสร้างaaaไดเรกทอรีที่ดูเหมือนว่าคุณไม่ต้องการ อย่างไรก็ตามคุณสามารถ cd aaaและคัดลอกเช่น:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

มันง่ายมากที่จะใช้installโปรแกรมจากcoreutilsที่มักใช้เพื่อจุดประสงค์นี้โดยการสร้างระบบเช่นautomake :

install -D /path/to/source /path/to/destination

โปรดทราบว่าการinstallสร้างทุกชิ้นส่วนของเส้นทางเช่นเดียวกับไม่เห็นmkdir -p man installฉันอยากรู้ว่าทำไมคุณไม่รวมเหตุผลที่คุณต้องการทำเช่นนั้น การโทรmkdirและcpเป็นเรื่องง่ายมาก


2
ฉันคิดว่ามีคำตอบที่ดีมากมายสำหรับคำถามนี้ แต่อันนี้ได้รับการโหวตของฉันเนื่องจากเป็นแบบพกพามากที่สุด rsyncคำตอบเดียวที่จะสร้าง 1 ไดเรกทอรีและpaxดูเหมือนจะไม่เป็นเรื่องปกติ
Patrick

ใช้-dแทน-Dบน Mac
Matt M.

โปรดทราบว่าคำสั่งนี้สร้างไฟล์ปลายทางที่มีสิทธิ์755( rwxr-xr-x) ซึ่งอาจไม่ต้องการ คุณสามารถระบุอย่างอื่นด้วย-mสวิตช์ แต่ฉันไม่สามารถหาวิธีที่จะเก็บสิทธิ์ของไฟล์ :(
törzsmókus

6

ด้วยคำสั่งมาตรฐาน (POSIX / Unix) คุณจะได้รับ:

pax -rws ':^:dest/dir/:' file .

1
น่าสนใจ ฉันไม่เคยได้ยินคนอื่นมาก่อน แม้ว่าฉันจะชอบแนวคิดของมัน น่าเสียดายแม้ว่าจะอยู่ใน POSIX ดูเหมือนว่า distros น้อยมากที่ติดตั้งโดยค่าเริ่มต้น :-(
Patrick

@ แพทริก - หากคุณข้ามไปจนสุดinfo tar- บางแห่งในส่วนที่เกี่ยวกับการพกพา - ฉันคิดว่าคุณจะพบว่า GNU tarอ้างว่าpaxเข้ากันได้อย่างสมบูรณ์ ฉันทำอยู่แล้วถึงแม้ว่าฉันยังไม่เคยไปไหนมาไหนเพื่อทดสอบการอ้างสิทธิ์เหล่านั้น
mikeserv

5

ฉันไม่ทราบวิธีการใช้cpงาน แต่ก็เป็นไปได้โดยใช้rsync:

$ rsync sourcefile dir/

โดยที่dirเป็นไดเรกทอรีที่ไม่จำเป็นต้องมีอยู่ มีวิธีอื่น ๆ อีกมากมายในการบรรลุเป้าหมายเดียวกันโดยใช้คำสั่งอื่น ๆ


3
คุณต้องrsync -Rรักษาลำดับการ
สืบทอด

@glennjackman แท้จริง 'เหมาะสม' ใช้rsyncความต้องการตัวเลือกมากขึ้น แต่คำถามเป็นเพียงเกี่ยวกับการสร้างไดเรกทอรีเป้าหมายที่ไม่มีอยู่จริงจึงสั้น ๆ คำตอบของฉัน :)
mjturner

1
อย่างน้อย GNU cpมี--parentsตัวเลือก
peterph

2
@peterph แน่นอน แต่จากนั้นคุณถูก จำกัด ในการตั้งชื่อไดเรกทอรีเป้าหมาย
mjturner

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

หากคุณไม่มีpax(มันเป็นคำสั่งของ POSIX ในฐานะการแทนที่มาตรฐานของ cpio และ tar ซึ่งมีความไม่เข้ากันมากเกินไปที่จะทำให้เป็นมาตรฐาน) ให้ใช้cpio -pหรือtar -cf - … | tar -xf -แทน

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