มันคือเชลล์ที่ขยาย 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