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