การใช้ -exec xargs และ -print0 คืออะไร


20

ฉันคิดว่าสิ่งเหล่านี้เป็นวิธีการทั่วไปในการส่งผลลัพธ์ของคำสั่งหนึ่งไปยังอีกคำสั่งหนึ่งเป็นอินพุต

ทั้งสามทำงานอย่างไร? หรือบางเว็บไซต์ / URL คืออะไร?

คำตอบ:


25

สิ่งแรกที่จะพิมพ์:

man find

man xargs

findคำสั่งพิมพ์ผลการออกมาตรฐานโดยค่าเริ่มต้นดังนั้น-printตัวเลือกที่เป็นปกติไม่จำเป็น แต่-print0แยกชื่อไฟล์ที่มี 0 (NULL) ไบต์ดังนั้นชื่อที่มีช่องว่างหรือบรรทัดใหม่สามารถตีความได้อย่างถูกต้อง

-execตัวเลือกเป็นสิ่งที่คุณสามารถใช้แทน xargs - ค้นหาคำสั่งรันคำสั่งสำหรับแต่ละรายการที่พบ

xargsคำสั่งอ่านสตริงเนื้อที่หรือขึ้นบรรทัดใหม่แยกออกจากกัน (โดยทั่วไปจากการค้นหาคำสั่ง แต่พวกเขาอาจจะมาจากที่ใดก็ได้) และรันคำสั่งบางอย่างสำหรับแต่ละสาย
หาก xargs ทำงานด้วยตัวเลือก-0มันจะคาดหวังว่าสตริงที่คั่นด้วย NULL เป็นเอาต์พุตโดยfind ... -print0

ข้อได้เปรียบของ xargs คือมันสามารถจัดกลุ่มสตริงเข้าด้วยกันเพื่อที่จะดำเนินการคำสั่งเพียงครั้งเดียวหรือสองครั้งแทนที่จะเป็นnครั้ง

ดังนั้นในการใช้งานปกติ:

find start_directory -name '*.txt' | xargs ls -l 

findจะแสดงรายการชื่อไฟล์และxargsจะออกคำสั่งเช่น:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

ซึ่งเร็วกว่าการออกคำสั่ง find ของคุณ:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt

7

โปรดทราบว่าไม่จำเป็นต้องใช้ xargs อีกต่อไปด้วยการนำการค้นหาปัจจุบันไปใช้ซึ่งอาจสนับสนุนไวยากรณ์ POSIX นี้ทั้งหมด:

find directory -name '*.txt' -exec ls -l {} + 

ซึ่งง่ายกว่าและเร็วกว่าตัวแปร xargs เล็กน้อย

find directory -name '*.txt' | xargs ls -l 

xargs ใช้ทรัพยากรน้อยกว่า 'find -exec'
Felipe Alvarez

7
นั่นเป็นวิธีอื่น ๆ การไปยัง xargs จะใช้ทรัพยากรมากกว่า -exec เล็กน้อย คุณอาจมองข้ามเครื่องหมาย "+"
jlliagre

2

อย่างน้อยหนึ่งลิงก์เหล่านั้นเสียชีวิต มันเป็นการดีกว่าที่จะโพสต์ตัวอย่างโค้ดที่เกี่ยวข้องเช่นกัน
user5359531

@ user5359531: ลิงค์ตายถูกแทนที่ และฉันไม่สามารถทำซ้ำบทเรียนมากมายเช่นนี้ได้
harrymc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.