ฉันต้องการคัดลอกไฟล์ทั้งหมดในไดเรกทอรีทั้งหมดไปยังไดเรกทอรีหลัก แต่ฉันได้รับข้อผิดพลาด
./img/* is not a directory
ตัวอย่างเช่น. นี่คือคำสั่งที่ฉันใช้ มีวิธีที่ดีกว่าในการทำเช่นนี้?
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
ฉันต้องการคัดลอกไฟล์ทั้งหมดในไดเรกทอรีทั้งหมดไปยังไดเรกทอรีหลัก แต่ฉันได้รับข้อผิดพลาด
./img/* is not a directory
ตัวอย่างเช่น. นี่คือคำสั่งที่ฉันใช้ มีวิธีที่ดีกว่าในการทำเช่นนี้?
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
คำตอบ:
ลอง:
find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;
พิจารณา:
find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;
เมื่อ bash เห็นบรรทัดนี้จะทำการขยายชื่อพา ธ {}/*
. เนื่องจากมี (โดยทั่วไป) ไม่มีชื่อไดเรกทอรี {}
, *
เหลือเป็นตัวอักษร *
. นี่ไม่ใช่สิ่งที่คุณต้องการ คุณต้องมีการขยายชื่อพา ธ หลังจาก find
ได้แทนที่ในสำหรับ {}
. โดยการวาง cp
คำสั่งในเครื่องหมายคำพูดและส่งผ่านเป็นอาร์กิวเมนต์ bash -c
เราบรรลุเป้าหมายนั้น
แบบฟอร์มตัวอย่างสำหรับ bash -c
ดูเหมือนกับ:
bash -c 'code...' a b c
สิ่งนี้บอกว่าทุบตีเพื่อมอบหมาย a
ไปยัง $0
, b
ไปยัง $1
, c
ไปยัง $2
จากนั้นดำเนินการ code...
. หากมีข้อผิดพลาดเกิดขึ้นเชลล์จะใช้ $0
เป็นชื่อของโปรแกรมที่กำลังดำเนินการ (ในข้อความข้อผิดพลาด) ด้านบนเราเลือก Cp
เป็นชื่อที่สื่อความหมาย นอกจากนี้ข้างต้น {}
ถูกแทนที่ด้วย $1
และเราใช้ประโยชน์ $1
ใน code...
. เมื่อใช้วิธีนี้ {}
ไม่จำเป็นต้องอ้าง (แต่มันไม่เจ็บถ้าคุณทำ); find
จัดการกับการหลบหนีที่จำเป็น ภายใน code...
อย่างไรก็ตาม $1
ควรอยู่ในเครื่องหมายคำพูดเพื่อป้องกันการแยกคำและการขยายชื่อ
สิ่งนี้อาจใช้งานได้
cd your_directory
cp -rp * /absolut_path_to_parent_directory