วิธีคัดลอกไฟล์จากโฟลเดอร์ที่ไม่มีโฟลเดอร์นั้น


39

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

| file1.txt   
| file2.txt    
| subfolder1   

การดำเนินการคำสั่งถัดไปให้ผลลัพธ์ที่ผิด:

sudo cp -r /home/username/A/ /usr/lib/B/

ผลที่ได้คือ

/usr/lib/B/A/...copied files...

แทน..

/usr/lib/B/...copied files...

ฉันจะไปถึงที่คาดหวังได้อย่างไรโดยไม่มีโฟลเดอร์ต้นทาง

คำตอบ:


67

cp ขั้นสูง

cp -r /home/username/A/. /usr/lib/B/

สิ่งนี้ยอดเยี่ยมเป็นพิเศษเพราะใช้งานได้ไม่ว่าจะมีไดเรกทอรีเป้าหมายอยู่แล้วหรือไม่

กะลา

หากมีวัตถุไม่มากเกินไปในไดเรกทอรีคุณสามารถใช้เปลือกกลมได้:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

/ในตอนท้ายของเส้นทางของแหล่งข้อมูลที่มีความสำคัญ; ใช้งานได้ไม่ว่าจะมีไดเรกทอรีเป้าหมายอยู่แล้วก็ตาม

หา

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

หรือถ้าคุณไม่ต้องการไดเรกทอรีย่อยที่ว่างเปล่า:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(ไม่รวมmkdir)


คนแรกใช้ได้ดี! ความคิดใดที่บ้าน / ชื่อผู้ใช้ / A / * (ที่มีสัญลักษณ์รูปดาว) ไม่สมเหตุสมผล ตัวแปรที่มีจุดท้ายช่วยฉันขอบคุณ!
pushandpop

@pushandpop A/*เข้าใจได้ แต่มีสถานการณ์ที่มันใช้ไม่ได้
Hauke ​​Laging

3
shoptมีความbashเฉพาะเจาะจง ด้วยการใช้zsh *(D)ด้วยksh93, FIGNORE='@(.|..)'. cp -tเฉพาะ GNU findหนึ่งจะไม่ทำงานอย่างถูกต้องที่จะคัดลอกทั้งสองA/และเนื้อหา (รวม subdirs) หลายต่อหลายครั้ง
Stéphane Chazelas

1
นอกจากนี้คุณยังต้องการ-maxdepth 1( -mindepthและ-maxdepthเป็นส่วนขยายของ GNU ในขณะนี้ด้วยการสนับสนุนจากคนอื่นอีกสองสามคนfind .../. ! -name . -prune -exec ....
พกพาได้

@ StéphaneChazelasฉันคิดว่ามันมีบางคำที่สะกดผิด find .../.ทำให้เกิดข้อผิดพลาดที่นี่
Hauke ​​Laging

10

หากอยู่ในระบบ GNU จากman cp:

   -T, --no-target-directory
          treat DEST as a normal file

สิ่งนี้ช่วยให้คุณเขียนcp -rT /home/username/A/ /usr/lib/B/เพื่อทำสิ่งที่ถูกต้อง


นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับนี้เป็นที่เหมาะสมกว่าเปลือก globbing cpหรือการใช้สิ่งอื่นมากกว่า แต่นั่นเป็นความจริงที่ว่าจะไม่ทำงานกับที่ไม่ใช่-T GNU cp
noraj

3

บอกcpให้คัดลอกเนื้อหาของไดเรกทอรีไม่ใช่ตัวไดเรกทอรีเอง:

sudo cp -r /home/username/A/* /usr/lib/B/

ขอบคุณ! แต่มันบอกว่า: / usr / lib / B /ไม่ใช่ไดเรกทอรี
pushandpop

คุณจะต้องshopt -s dotglobสำหรับการทำงานถ้ามี dotfiles ใด ๆ /home/username/A/ใน
พูดคุย

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