คัดลอกเฉพาะไฟล์ปกติจากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง


12

ฉันต้องการคัดลอกเนื้อหาของไดเรกทอรี 1 ไปยังไดเรกทอรี 2 อย่างไรก็ตามฉันต้องการคัดลอกเฉพาะไฟล์ (และไม่ใช่ไดเรกทอรี) จากไดเรกทอรีของฉัน 1 ฉันจะทำอย่างไร

cp dir1/* dir2/*

แล้วฉันยังคงมีปัญหาไดเรกทอรี

นอกจากนี้ไฟล์ทั้งหมดของฉันไม่ได้มีส่วนขยายใด ๆ ดังนั้น จะไม่ทำเคล็ดลับ


1
ไม่ทราบว่าส่วนขยายเกี่ยวข้องกับอะไรบ้าง
ctrl-alt-delor

1
cp dir1/* dir2หรือcp -t dir2 dir1/*
ctrl-alt-delor

@ Richard มีนิสัยที่ค่อนข้างธรรมดาที่มาจากโลก DOS ที่ไม่ได้ใช้ส่วนขยายสำหรับไดเรกทอรีซึ่งยังมีชีวิตอยู่ในระดับหนึ่งทำให้บางคนคิดว่าถ้ามีจุดแล้วมันไม่ใช่ไดเรกทอรีและในทางกลับกัน
Gilles 'หยุดความชั่วร้าย'

ตกลง แต่ก็ยังไม่เกี่ยวข้อง
ctrl-alt-delor

คำตอบ:


18
cp dir1/* dir2

cpจะไม่คัดลอกไดเรกทอรีเว้นแต่ได้รับคำสั่งให้ทำเช่นนั้นอย่างชัดเจน ( --recursiveเช่นดูที่man cp)

หมายเหตุ 1: cpส่วนใหญ่จะออกจากสถานะไม่เป็นศูนย์ แต่ไฟล์จะถูกคัดลอกต่อไป นี้อาจจะเป็นปัญหาเมื่อผูกมัดคำสั่งบนพื้นฐานของรหัสออก: &&, ||, if cp -r dir1/* dir2; then ...ฯลฯ (ขอขอบคุณcontrebisสำหรับความคิดเห็นของพวกเขาเกี่ยวกับเรื่องที่ )

หมายเหตุ 2 : cpคาดว่าพารามิเตอร์สุดท้ายจะเป็นชื่อไฟล์หรือไดเรกทอรีเดียว ไม่ควรมีสัญลักษณ์แทนที่*หลังจากชื่อของไดเรกทอรีเป้าหมาย จะได้รับการขยายตัวเปลือกเช่นเดียวกับdir2\* dir1\*สิ่งที่ไม่คาดคิดจะเกิดขึ้น:

  • ถ้าdir2ว่างเปล่าและขึ้นอยู่กับเชลล์และการตั้งค่าของคุณ:
    • คุณอาจได้รับข้อความแสดงข้อผิดพลาดซึ่งเป็นสถานการณ์กรณีที่ดีที่สุด
    • dir2/*จะถูกดำเนินการตามตัวอักษร (มองหาไฟล์ / ไดเรกทอรีชื่อ*) ซึ่งอาจจะนำไปสู่ข้อผิดพลาดเช่นกันเว้นแต่*จะมีอยู่จริง
    • dir2/*มันจะถูกลบออกจากคำสั่งทั้งหมดออกcp dir1/*ไป ซึ่งขึ้นอยู่กับการขยายตัวของdir1/*อาจทำลายข้อมูล:
      • หากการแข่งขันเพียงหนึ่งแฟ้มหรือไดเรกทอรีคุณจะได้รับข้อผิดพลาดจากdir1/*cp
      • หากdir1/*ตรงกับสองไฟล์หนึ่งไฟล์จะถูกเขียนทับโดยไฟล์อื่น ( ไม่ดี )
      • หากdir/*ตรงกับหลายไฟล์และการแข่งขันครั้งสุดท้ายคือคุณจะได้รับข้อความแสดงข้อผิดพลาด
      • หากการจับคู่ครั้งสุดท้ายของdir/*เป็นไดเรกทอรีการแข่งขันอื่น ๆ ทั้งหมดจะถูกย้ายเข้าไป
  • หากdir2ไม่ว่างเปล่าอีกครั้งจะขึ้นอยู่กับ:
    • หากการจับคู่ครั้งสุดท้ายของdir2/*คือไดเรกทอรีdir1/*และการแข่งขันอื่น ๆ ของdir2/*จะถูกย้ายเข้า
    • หากการจับคู่ครั้งสุดท้ายของdir2/*เป็นไฟล์คุณอาจจะได้รับข้อความแสดงข้อผิดพลาดยกเว้น dir1/*ตรงกับไฟล์เดียวเท่านั้น

$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).ออกจากสถานะ 1 สำหรับฉัน
ควบคุม

1
ใช่มันจะออกโดยมีสถานะเป็น 1 สำหรับฉันเช่นกัน แต่ถึงอย่างcpนั้นคัดลอกไฟล์ที่ตรงdir1/*กับทุกระบบที่ฉันตรวจสอบ: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 และ 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 และ 10 (ที่cpจริงออกด้วยรหัส 2) ดังนั้นพฤติกรรมนี้ไม่ใช่เรื่องใหม่ (SuSE 8.1 มาจาก 2002) และไม่ จำกัด เฉพาะ Linux cpออกด้วยรหัสออกที่ไม่เป็นศูนย์เพราะมันไม่สามารถทำทุกอย่างที่บอกให้ทำ ไม่ได้หมายความว่ามันไม่ทำอะไรเลย
Adaephon

3
แน่นอนฉันคิดว่าน่าสังเกตเพราะถ้าคุณกำลังผูกมัดคำสั่งพร้อมกับ&&สิ่งนี้อาจทำให้เกิดปัญหา ฉันพยายามทำสิ่งนี้แม้ว่าฉันจะจำบริบทไม่ได้ในตอนนี้
ข้อเสนอ

นี่ไม่ได้คัดลอกไฟล์ที่ซ่อนอยู่
felwithe

@felwithe ไม่ว่าจะ*มีไฟล์ที่ซ่อนอยู่หรือวิธีการรวมไฟล์ที่ซ่อนอยู่ขึ้นอยู่กับเปลือก หากไม่รวมถึงไฟล์ที่ซ่อนอยู่คุณสามารถตรงกับพวกเขาด้วย* .*หมายเหตุที่ว่านี้จะรวม.และ..บนbashและแต่ไม่ได้อยู่ในdash zshในบริบทของคำตอบนี้คุณสามารถไปcp dir1/* dir1/.* dir2เพราะ.และ..เป็นไดเรกทอรีและจะไม่ถูกคัดลอก นอกจากนี้ยังสามารถสร้างขึ้นมาเพื่อรวมไฟล์ที่ซ่อนอยู่ด้วยzsh *(D)
Adaephon

7

มันคือเชลล์ที่ขยาย wildcard ไม่ใช่คำสั่ง ดังนั้นcp dir1/* dir2/*ก่อนอื่นจึงขยาย wildcard สองตัวจากนั้นเรียกcpผลลัพธ์ นี้ไม่ได้เป็นทุกสิ่งที่คุณเห็นได้ชัดว่าคาดหวัง: ขึ้นอยู่กับจำนวนไฟล์ที่มีอยู่แล้วในdir2, dir2/*อาจขยายไปยังอาร์กิวเมนต์หนึ่งหรือมากกว่า คำสั่งcpไม่ทราบว่าข้อโต้แย้งใดมาจากการขยายรูปแบบแรกและอันไหนมาจากการขยายรูปแบบที่สอง คาดว่าอาร์กิวเมนต์สุดท้ายจะเป็นชื่อของไดเรกทอรีปลายทาง ดังนั้นในการคัดลอกไฟล์ทั้งหมดจากไดเรกทอรีdir1ไปยังไดเรกทอรีdir2อาร์กิวเมนต์สุดท้ายจะต้องเป็นไดเรกทอรีdir2:

cp dir1/* dir2

เนื่องจาก*ตรงกับไฟล์ทั้งหมดcpพยายามคัดลอกไฟล์ทั้งหมด ซึ่งรวมถึงไดเรกทอรี: ไดเรกทอรีเป็นไฟล์ด้วย มันข้ามไดเรกทอรี แต่รายงานข้อผิดพลาด มันสำเนาเนื้อหาของแฟ้มพิเศษเช่นท่อชื่อ (บางสิ่งบางอย่างได้ดีกว่าจะเขียนให้กับพวกเขาหรือcpจะปิดกั้น) ฯลฯ

หากต้องการคัดลอกเฉพาะไฟล์ปกติคุณจะต้อง จำกัด การจับคู่ ใน zsh คุณสามารถใช้ตัวระบุglob .สำหรับสิ่งต่อไปนี้:

cp dir1/*(.) dir2

กระสุนอื่น ๆ ไม่มีสิ่งนี้ คุณสามารถใช้findคำสั่งเพื่อกรองประเภทไฟล์ สมมติว่าคุณใช้ Linux หรือ Cygwin ที่ไม่ได้ฝังอยู่:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

บน Linux, FreeBSD และ OSX:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2

มีเหตุผลระบุ-maxdepth 1หรือไม่ นอกจากนี้ยังมีวิธีการทำซ้ำและเก็บรักษาลำดับชั้นไดเรกทอรีดั้งเดิมในไดเรกทอรีปลายทางซ้ำหรือไม่
Abdull

โดยไม่ต้อง @Abdull -maxdepth 1ที่findคำสั่งจะ recurse ลงในไดเรกทอรีย่อยซึ่งไม่ได้ต้องการที่นี่ cp -a dir1 dir2หากคุณต้องการคัดลอกต้นไม้ไดเรกทอรีทั้งหมดรวมทั้งไดเรกทอรีย่อยจะเป็นคำถามที่แตกต่างกันอย่างสิ้นเชิงและคำตอบคือง่ายมาก:
Gilles 'หยุดความชั่วร้าย'

0

ด้านล่างเป็นคำสั่งให้คัดลอกไฟล์จากแหล่งข้อมูลไปยังไดเรกทอรีปลายทาง

  1. ไปที่โฟลเดอร์ซอร์สแล้วเขียนคำสั่งด้านล่าง:

    $ cp fileName destination directory path

ตัวอย่าง:

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