มีหลายวิธีในการทำเช่นนี้รวมถึงลูปในเชลล์สคริปต์ค้นหาและ xargs อันไหนดีที่สุดและพกพาสะดวกที่สุด?
มีหลายวิธีในการทำเช่นนี้รวมถึงลูปในเชลล์สคริปต์ค้นหาและ xargs อันไหนดีที่สุดและพกพาสะดวกที่สุด?
คำตอบ:
find . -exec <command> {} \;
สำหรับไดเรกทอรีปัจจุบันเป็นรากของต้นไม้หรือโดยทั่วไป:
find <directory> -exec <command> {} \;
find ... | xargs ...
สำนวนมันประมวลผลไฟล์เป็นชุดและมักจะเร็วกว่า
ใช้-print0
ตัวเลือกเพื่อค้นหาและ-0
ตัวเลือกxargs
หากคุณมีชื่อไฟล์หรือไดเรกทอรีที่มีช่องว่าง:
find {dir} -print0 | xargs -0r {command}
-print0
ตัวเลือกในการค้นหาพิมพ์ชื่อไฟล์ออกเป็นNUL
-separated มากกว่าช่องว่างคั่นรายการในขณะที่-0
ตัวเลือกที่จะxargs
สั่งให้มันจะทำลายการป้อนข้อมูลของตนในNUL
มากกว่าช่องว่าง เนื่องจากNUL
เป็นหนึ่งในตัวละครที่ไม่ได้รับอนุญาตในชื่อไฟล์ Unix จึงไม่มีทางที่มันจะถูกเข้าใจผิดว่าเป็นส่วนหนึ่งของชื่อไฟล์
-r
ตัวเลือกที่มีเพื่อที่xargs
จะไม่ให้เกิดข้อผิดพลาดถ้ามันไม่มีการป้อนข้อมูล
หากความสะดวกในการพกพาเป็นปัญหาฉันจะอยู่ห่างจากวิธีเฉพาะของการทำเชลล์ (มีคนจำนวนมากที่ใช้เชลล์ที่แตกต่างกันจำนวนมาก แต่โดยทั่วไปแล้วการค้นหาและ xargs เป็นเครื่องมือพื้นฐานจริงๆที่ไม่มีใครกล้าเปลี่ยนแปลงอย่างรุนแรง) .
การใช้อาร์กิวเมนต์พื้นฐานของ find และ xargs ควรให้โซลูชันที่พกพาได้มากกว่า
หากการจัดกลุ่มข้อโต้แย้งเข้าด้วยกันเป็นที่ยอมรับให้ค้นหา | xargs อาจให้ประสิทธิภาพที่ดีขึ้นเนื่องจากจะรันคำสั่งน้อยกว่าการค้นหา -exec หากคุณต้องการรันคำสั่งในแต่ละครั้งสำหรับแต่ละไฟล์หรือดำเนินการในไดเรกทอรีย่อยของไฟล์คุณควรใช้ find -exec หรือ -execdir
ตามกฎแล้วจะดีกว่าที่จะอยู่ห่างจากลูปเฉพาะเชลล์ find & xargs เพียงพอสำหรับสถานการณ์ส่วนใหญ่
ตรวจสอบให้แน่ใจว่าเวอร์ชันของคำสั่งที่คุณใช้ยังไม่มีแฟล็กสำหรับการดำเนินการซ้ำ :)
find [args] -print | xargs {command}
ทำงานได้ดีที่สุดสำหรับฉัน