คัดลอกไฟล์จากไดเรกทอรีหนึ่งไปยังไดเรกทอรีที่มีอยู่


248

ในทุบตีฉันต้องทำสิ่งนี้:

  1. ใช้ไฟล์ทั้งหมดในไดเรกทอรี

  2. คัดลอกไปยังไดเรกทอรีที่มีอยู่

ฉันจะทำสิ่งนี้ได้อย่างไร ฉันลองcp -r t1 t2(ทั้ง t1 และ t2 เป็นไดเร็กตอรี่ที่มีอยู่, t1 มีไฟล์อยู่) แต่มันสร้างไดเร็กตอรี่ชื่อ t1 ใน t2, ฉันไม่ต้องการมัน, ฉันต้องการไฟล์ใน t1 เพื่อไปยัง t2 โดยตรง ฉันจะทำสิ่งนี้ได้อย่างไร


11
ทำไมสิ่งนี้จึงถูกปิด มันเป็นกฎเกณฑ์ถ้าคำสั่ง bash เป็นคำสั่งในตัวหรือภายนอก (เช่น printf มีอยู่เป็นทั้งในระบบส่วนใหญ่) ดังนั้นcpคำถามที่สามารถมองเห็นได้เป็นbashคำถามซึ่งเป็นภาษาการเขียนโปรแกรม ฉันไม่เคยเห็นคำถาม Python ที่พูดถึงการคัดลอกไฟล์ถูกปิด
Ciro Santilli 法轮功冠状病六四事件法轮功


ฉันมาถึงเพื่อค้นหาคำเตือนเกี่ยวกับไวยากรณ์ของคำสั่ง Bash shell copy และฉันยินดีที่จะรายงานว่าคำสั่งเหล่านี้ดูเหมือนว่าจะทำงานกับระบบไฟล์ NTFS พื้นฐานในการติดตั้ง Windows ของฉัน
David A. Grey

คำตอบ:


396

สิ่งที่คุณต้องการคือ:

cp -R t1/. t2/

จุดท้ายบอกให้คัดลอกเนื้อหาของไดเรกทอรีปัจจุบันไม่ใช่ตัวไดเรกทอรีเอง วิธีนี้ยังรวมถึงไฟล์และโฟลเดอร์ที่ซ่อนอยู่


2
ผมชอบรูปแบบนี้ mvแต่ด้วยเหตุผลบางอย่างมันไม่ได้ทำงานกับ ไม่มีใครรู้ว่าทำไม
Martin von Wittich

2
น่าอัศจรรย์ เอกสารนี้อยู่ที่ไหน มันเป็น POSIX หรือส่วนขยาย?
Ciro Santilli 法轮功冠状病六四事件法轮功

9
@CiroSantilli 六四事件法轮功包卓轩หากคุณคัดลอกไดเรกทอรี cp จะสร้างไดเรกทอรีและคัดลอกไฟล์ทั้งหมดลงในมัน หากคุณใช้โฟลเดอร์แกล้งที่เรียกว่า "." ซึ่งเหมือนกับไดเรกทอรีที่เก็บไว้สำเนาจะทำงานในลักษณะนี้ สมมุติว่า t1 มีไฟล์ชื่อ "file" cp จะดำเนินการเทียบเท่ากับ "cp t1 /./ file t2 /./" มันกำลังคัดลอกโฟลเดอร์ "." แต่คัดลอกไฟล์ลงใน t2's "" โฟลเดอร์จะแยกแถบ "./" เพราะ "t2 /./" เหมือนกับ "t2 /" ในทางเทคนิคหมายความว่ามันเป็น POSIX ที่มีพฤติกรรม ... แต่อาจไม่ใช่ในแบบที่คุณคาดหวัง!
โดดเด่น

35

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

cp dir1/* .

สิ่งนี้ถือว่าคุณไม่ได้พยายามคัดลอกไฟล์ที่ซ่อนอยู่


20
คิดถึงไฟล์ที่ซ่อนอยู่
Ciro Santilli 法轮功冠状病六四事件法轮功

1
นอกจากนี้ยังล้มเหลวสำหรับไฟล์จำนวนมาก (เพราะ '*' ไม่สามารถขยายไปยังไฟล์จำนวนมาก .. ) y
moritzschaefer

32
cp dir1/* dir2

หรือถ้าคุณมีไดเรกทอรีภายใน dir1 ที่คุณต้องการคัดลอกเช่นกัน

cp -r dir1/* dir2

3
คุณอาจต้องใช้ "dir1 / * dir1 /.*" แทน "dir1 / *" ทั้งนี้ขึ้นอยู่กับวิธีกำหนดค่าเชลล์ของคุณหากคุณต้องการจับไฟล์ที่ซ่อนอยู่ด้วย
ssokolow

2
การคัดลอกdir1/.*ไม่ใช่ความคิดที่ดีเนื่องจากเป็นการคัดลอก dir1 / .. (เช่นพาเรนต์ของไดเรกทอรีที่คุณพยายามคัดลอก) นอกจากนี้ยังคัดลอก dir1 / ซึ่งก็ดียกเว้นว่ามันถูกคัดลอกมาแล้ว (ส่วนใหญ่) ดังนั้นคุณทำงานสองครั้ง
Gordon Davisson

1
คุณจะได้รับรอบdir1/.*/ .ซ่อนปัญหาไฟล์จากแผ่นซีดีไอเอ็นจีลงในไดเรกทอรีที่คุณต้องการคัดลอกจากนั้นหมายถึงว่ามันเป็น ดังนั้นถ้าคุณต้องการที่จะคัดลอกไฟล์ทั้งหมดรวมถึงไฟล์ที่ซ่อนอยู่จากไดเรกทอรีลงในไดเรกทอรีที่มีอยู่คุณสามารถ: ,cd [source dir] cp . [path to destination dir, with no trailing slash]
RobW

8

สมมติว่า t1 เป็นโฟลเดอร์ที่มีไฟล์อยู่ในนั้นและ t2 เป็นไดเรกทอรีว่างเปล่า สิ่งที่คุณต้องการคือสิ่งนี้:

sudo cp -R t1/* t2/

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

sudo cp -R t1/* ./

หรือคุณสามารถนำทางไปยังโฟลเดอร์ด้วยไฟล์ (t1) และทำสิ่งนี้:

sudo cp -R ./* t2/

หมายเหตุ: เครื่องหมาย * (หรือไวด์การ์ด) หมายถึงไฟล์และโฟลเดอร์ทั้งหมด แฟล็ก -R หมายถึงการเรียกซ้ำ (ทุกอย่างภายในทุกอย่าง)


2
cp -R t1/ t2

เครื่องหมายสแลชต่อท้ายบนไดเรกทอรีต้นทางจะเปลี่ยนซีแมนทิกส์เล็กน้อยดังนั้นจึงคัดลอกเนื้อหา แต่ไม่ใช่ไดเรกทอรีเอง นอกจากนี้ยังช่วยหลีกเลี่ยงปัญหาไฟล์กลมและไฟล์ที่มองไม่เห็นที่คำตอบของเบอร์ทรานด์มีอยู่ (คัดลอกt1/*ไฟล์ที่มองไม่เห็นคัดลอก `t1 / * t1 /.* 'คัดลอก t1 /. และ t1 / .. ซึ่งคุณไม่ต้องการ)


วิธีการแก้ปัญหาของคุณไม่ทำงานอย่างน้อยไม่ได้อยู่ในการติดตั้งของฉัน (อูบุนตู 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (ขออภัยไม่มี codeformat ในความคิดเห็นเวอร์ชันที่อ่านได้ที่pastebin.com/yszSxV6G )
zpon

2

ขึ้นอยู่กับรายละเอียดบางอย่างคุณอาจต้องทำสิ่งนี้:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... สิ่งนี้จะเปลี่ยนไปเป็นไดเรกทอรี SRC และคัดลอกไปยังเป้าหมายจากนั้นกลับสู่จุดที่เคยเป็นมา

ความยุ่งเหยิงพิเศษคือการจัดการกับเป้าหมายที่เกี่ยวข้องหรือแน่นอน

(สิ่งนี้ไม่ได้ขึ้นอยู่กับความหมายที่ลึกซึ้งของcpคำสั่งเอง ... เกี่ยวกับวิธีจัดการข้อมูลจำเพาะของแหล่งที่มีหรือไม่มีการต่อท้าย / ... เนื่องจากฉันไม่แน่ใจว่าสิ่งเหล่านั้นมีเสถียรภาพพกพาและเชื่อถือได้มากกว่าแค่ GNU cpและฉัน ไม่รู้ว่าพวกเขาจะยังเป็นเช่นนี้ต่อไปในอนาคต)


1

สำหรับในบางไดเรกทอรีนี้จะใช้แบบเต็มเนื่องจากคัดลอกเนื้อหาทั้งหมดจาก "folder1" ไปยังไดเรกทอรีใหม่ "folder2" ในบางไดเรกทอรี

$ (pwd) จะได้รับเส้นทางสำหรับไดเรกทอรีปัจจุบัน

สังเกตเห็นจุด (.) หลัง folder1 เพื่อรับเนื้อหาทั้งหมดภายใน folder1

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