วิธีที่ดีที่สุดเรียกใช้คำสั่งในแต่ละไฟล์ในแผนผังไดเรกทอรี


13

มีหลายวิธีในการทำเช่นนี้รวมถึงลูปในเชลล์สคริปต์ค้นหาและ xargs อันไหนดีที่สุดและพกพาสะดวกที่สุด?

คำตอบ:


13
find . -exec <command> {} \;

สำหรับไดเรกทอรีปัจจุบันเป็นรากของต้นไม้หรือโดยทั่วไป:

find <directory> -exec <command> {} \;

4
ในบางระบบค้นหา dont มีตัวเลือก -exec ที่นั่นคุณสามารถใช้ find | xargs <Command>
Hemant

4
แน่นอนและถ้าคุณต้องการกรองโดยบางสิ่งลอง-name "*.c"หรือตัวอย่าง-type dสำหรับไดเรกทอรี ...

ค้นหาสามารถทำสิ่งที่ซับซ้อนอย่างน่าประหลาดใจ - คุณอาจต้องการตรวจสอบหน้าคน - unixhelp.ed.ac.uk/CGI/man-cgi?find - สำหรับรายการตัวเลือกแบบเต็ม
ลูคัสโจนส์

คุณอาจต้องระวังชื่อไฟล์ที่มีช่องว่างซึ่งอาจแตกวิธี -exec และ xargs ดูtinyurl.com/ygvgmw5
Shawn Chin

หากเป็นไปได้ให้ใช้find ... | xargs ...สำนวนมันประมวลผลไฟล์เป็นชุดและมักจะเร็วกว่า
vonbrand

5

ใช้-print0ตัวเลือกเพื่อค้นหาและ-0ตัวเลือกxargsหากคุณมีชื่อไฟล์หรือไดเรกทอรีที่มีช่องว่าง:

find {dir} -print0 | xargs -0r {command}

-print0ตัวเลือกในการค้นหาพิมพ์ชื่อไฟล์ออกเป็นNUL-separated มากกว่าช่องว่างคั่นรายการในขณะที่-0ตัวเลือกที่จะxargsสั่งให้มันจะทำลายการป้อนข้อมูลของตนในNULมากกว่าช่องว่าง เนื่องจากNULเป็นหนึ่งในตัวละครที่ไม่ได้รับอนุญาตในชื่อไฟล์ Unix จึงไม่มีทางที่มันจะถูกเข้าใจผิดว่าเป็นส่วนหนึ่งของชื่อไฟล์

-rตัวเลือกที่มีเพื่อที่xargsจะไม่ให้เกิดข้อผิดพลาดถ้ามันไม่มีการป้อนข้อมูล


3

หากความสะดวกในการพกพาเป็นปัญหาฉันจะอยู่ห่างจากวิธีเฉพาะของการทำเชลล์ (มีคนจำนวนมากที่ใช้เชลล์ที่แตกต่างกันจำนวนมาก แต่โดยทั่วไปแล้วการค้นหาและ xargs เป็นเครื่องมือพื้นฐานจริงๆที่ไม่มีใครกล้าเปลี่ยนแปลงอย่างรุนแรง) .

การใช้อาร์กิวเมนต์พื้นฐานของ find และ xargs ควรให้โซลูชันที่พกพาได้มากกว่า


2

หากการจัดกลุ่มข้อโต้แย้งเข้าด้วยกันเป็นที่ยอมรับให้ค้นหา | xargs อาจให้ประสิทธิภาพที่ดีขึ้นเนื่องจากจะรันคำสั่งน้อยกว่าการค้นหา -exec หากคุณต้องการรันคำสั่งในแต่ละครั้งสำหรับแต่ละไฟล์หรือดำเนินการในไดเรกทอรีย่อยของไฟล์คุณควรใช้ find -exec หรือ -execdir

ตามกฎแล้วจะดีกว่าที่จะอยู่ห่างจากลูปเฉพาะเชลล์ find & xargs เพียงพอสำหรับสถานการณ์ส่วนใหญ่


1

ตรวจสอบให้แน่ใจว่าเวอร์ชันของคำสั่งที่คุณใช้ยังไม่มีแฟล็กสำหรับการดำเนินการซ้ำ :)


0
find [args] -print | xargs {command}

ทำงานได้ดีที่สุดสำหรับฉัน


2
-1 จะไม่ทำงานกับชื่อไฟล์ที่มีช่องว่าง ใช้ดีกว่าค้นหา -print0 | xargs -0
starblue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.