หากฉันต้องการคัดลอก*.so
ไฟล์ทั้งหมดจากsrc
ไปยังdst
ฉันจะทำ:
cp src/*.so dst
แต่ผมต้องการที่จะคัดลอก*.so
ไฟล์จาก src และมันเป็น subdirsdst
เข้า เบาะแสใด ๆ
หากฉันต้องการคัดลอก*.so
ไฟล์ทั้งหมดจากsrc
ไปยังdst
ฉันจะทำ:
cp src/*.so dst
แต่ผมต้องการที่จะคัดลอก*.so
ไฟล์จาก src และมันเป็น subdirsdst
เข้า เบาะแสใด ๆ
คำตอบ:
ลอง:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
ไกลเกินดุลรูปแบบเปลือกเรียบง่ายใช้ในพารามิเตอร์ -name
นอกจากนี้ยังห่างไกลที่มีประสิทธิภาพมากขึ้นกว่าพารามิเตอร์ find
xargs
-exec
find
หากคุณใช้ Bash คุณสามารถเปิดglobstar
ตัวเลือกเชลล์เพื่อจับคู่ไฟล์และไดเรกทอรีซ้ำ:
shopt -s globstar
cp src/**/*.so dst
หากคุณต้องการค้นหาไฟล์ที่ชื่อขึ้นต้นด้วย.
และ / หรือไฟล์ในและภายใต้ไดเรกทอรีที่ชื่อขึ้นต้น.
ให้ตั้งค่าdotglob
ตัวเลือกด้วย (เช่นกับshopt -s dotglob
) คุณสามารถตั้งค่าได้ทั้งสองในคำสั่งเดียว:
shopt -s globstar dotglob
ฉันลองคำสั่งที่ Mike แนะนำ:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
แต่มันจบลงด้วยการทิ้งไฟล์ทั้งหมดลงในไดเรกทอรีที่dst
มีเส้นทางญาติของพวกเขาหายไป
ในการเก็บพา ธ สัมพัทธ์คำสั่งจะต้องมีการแก้ไขในสิ่งนี้:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
แต่นี้อนุมานว่าไดเรกทอรีที่สอดคล้องกับเส้นทางแหล่งญาติอยู่ภายใต้ cp --parents
ในกรณีที่ไม่ได้เป็นเช่นนั้นการใช้งาน นอกจากนี้อย่าลืมอ้างชื่อไฟล์ ดังนั้น: ... | xargs -i cp --parents "{}" dst
(โปรดทราบว่าอาร์กิวเมนต์สุดท้ายที่cp
เป็นตอนนี้ "เพียงแค่" ไดเรกทอรีปลายทาง) คำสั่งที่สามารถทำแม้สั้น (และอาจจะเร็วกว่า) โดยใช้ธง:-t
... | xargs cp --parents -t dst
... | xargs cp {} --parents -t dst.
--parents
ไม่สามารถใช้งานได้ ฉันใช้ditto
แทน: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
อีกวิธีในการทำเช่นนี้คือ:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
... -exec cp -t dst/ {} +
-exec
ด้วย;
, {}
จะถูกแทนที่โดยเส้นทางในช่วงเวลาหนึ่ง คุณได้รับแยกต่างหากcp
สำหรับทุกไฟล์ ด้วย+
ไวยากรณ์find
จะแทนที่{}
ด้วยผลลัพธ์หลายรายการ (สูงสุดถึงขีด จำกัด ที่ระบบกำหนดของความยาวบรรทัดคำสั่งการ จำกัด : {}
ต้องเป็นสิ่งสุดท้ายก่อน+
ดังนั้นcp -t
) การสร้างและการยกเลิกโปรเซสนั้นค่อนข้างแพง ด้วยเหตุนี้จึงเป็นการดีที่จะใช้+
เมื่อใดก็ตามที่คุณคาดหวังผลลัพธ์จำนวนมาก ในกรณีนี้การคัดลอกไฟล์จำนวนมากอาจใช้เวลานานดังนั้นความแตกต่างอาจไม่มีการสังเกต อย่างไรก็ตามมันเป็นการปฏิบัติที่ดี
grep สามารถถูกแทนที่โดยใช้ find's -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
สามารถจับคู่รูปแบบและรันคำสั่งได้ ไม่จำเป็นต้องมีท่อไม่มีเอาท์พุท:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'