คัดลอกเนื้อหาของไดเรกทอรีปัจจุบันไปยังไดเรกทอรีย่อย


13

ฉันจะใช้เทอร์มินัล Linux เพื่อคัดลอกทุกสิ่งในไดเรกทอรีปัจจุบันไปยังไดเรกทอรีย่อยได้อย่างไร


คุณหมายถึงการคัดลอกหรือย้าย?
Craig

คำตอบ:


12

หากคุณต้องการคัดลอกเนื้อหาของโฟลเดอร์ซ้ำ (จะโยน 1 ข้อผิดพลาดทางเลือกด้านล่าง):

cp -r * sub/

แฮ็คเพิ่มอีกเล็กน้อย แต่ทำงานในไดเรกทอรีย่อยที่ไม่ว่าง:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

ตัวเลือกอื่น:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

หรือเรียกซ้ำ:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

สิ่งนี้ไม่ทำงานในกรณีที่ sub / ไม่ว่าง -> sub จะถูกคัดลอกไปยัง sub อีกครั้งเว้นแต่ว่าเป็นสิ่งที่ @Oguz ต้องการ

ในที่สุดฉันก็พอใจกับfindรหัส: D
Lekensteyn

2
คำสั่งที่สองของคุณล้มเหลวสำหรับชื่อไฟล์ที่มีช่องว่าง ใช้หรือxargs -execไม่จำเป็นต้องgrepใช้! -name "$TARGETDIR"หรือคล้ายกัน $fileคุณมีคำพูดที่ไม่ตรงกันรอบ ๆ ฉันไม่คิดว่า recursive cpจะทำงานตามที่คุณตั้งใจ แต่อย่างใด
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

Wohaa พลาดคำพูดในรหัสสุดท้าย แสดงความคิดเห็นที่ดีเดนนิสผมไม่เคยคิดว่าการใช้ -name ในกรณีนี้ :)
Lekensteyn

4

สมมติว่าtargetเป็นชื่อของไดเรกทอรีย่อยเป้าหมายหากเชลล์ของคุณเป็นทุบตี:

shopt -s extglob
cp -r !(target) target/

ใน ksh cp -r !(target) target/คุณโดยตรงสามารถทำ

ใน zsh คุณสามารถทำได้แล้วsetopt ksh_glob cp -r !(target) target/เป็นไปได้ก็คือแล้วsetopt extended_globcp -r ^target target/


2

ฉันขอแนะนำให้ย้ายไดเรกทอรีเป้าหมายนอกไดเรกทอรีต้นทางแล้วนำกลับมาอีกครั้ง mv ไม่มีค่าใช้จ่าย (ถ้าคุณระมัดระวังที่จะไม่ย้ายไปยังระบบไฟล์อื่น) เว้นแต่ว่าคุณคาดว่ากระบวนการอื่นจะรบกวน / แทรกแซง

โซลูชันส่วนใหญ่ที่โพสต์ด้านบนจะไม่ทำงานหากมีช่องว่างในชื่อไฟล์ ฉันอยากจะแนะนำให้ใช้ตัวแปรของ find -print0 | xargs -0 หรือค้นหา -exec เป็นต้น


0

จะใช้งานได้สำหรับคุณหรือไม่

cp -r * subdir/

หากคุณต้องการย้ายแทนที่จะคัดลอกทุกสิ่งใน dir ปัจจุบันไปยังไดเรกทอรีย่อยคุณสามารถทำได้:

mv * subdir/

สิ่งนี้ไม่ได้ดูแลไดเรกทอรีที่ไม่ว่างเปล่า

ฉันเพิ่งทดสอบและใช้งานได้
karlphillip

คุณต้องคัดลอกไดเรกทอรีที่ไม่ว่างซ้ำตามที่แนะนำ @Lekensteyn

-1

สิ่งนี้จะคัดลอกทุกอย่างรวมถึงไฟล์ dot และไม่รวมไดเรกทอรีเป้าหมายไปยังไดเรกทอรีเป้าหมายSUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
ล้มเหลวสำหรับชื่อไฟล์ที่มีช่องว่าง
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

-1

นี้ไปในไฟล์พูด dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

เรียกใช้เป็น "sh dirCopy.sh" ในคอนโซลของคุณ


2
ไม่จำเป็นต้อง:ls for file in *ไม่จำเป็นต้อง backticks - $()การใช้งาน ไม่จำเป็นต้องมี backticks (หรือ$()) รอบcpคำสั่ง (ที่จะสร้างข้อความแสดงข้อผิดพลาด)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.