หากฉันต้องการคัดลอก*.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 นอกจากนี้ยังห่างไกลที่มีประสิทธิภาพมากขึ้นกว่าพารามิเตอร์ findxargs-execfind
หากคุณใช้ 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/ ';'