ฉันจะจัดการช่องว่างในชื่อไฟล์เมื่อใช้ xargs ในการค้นหาผลลัพธ์ได้อย่างไร


28

หนึ่งในวิธีปฏิบัติทั่วไปของฉันคือการใช้ greps กับไฟล์ทุกประเภทเช่นหาไฟล์ HTML ทั้งหมดที่มีคำว่า "rumpus" อยู่ในนั้น ฉันจะใช้มัน

find /path/to -name "*.html" | xargs grep -l "rumpus"

บางครั้งจะกลับมาไฟล์ที่มีช่องว่างในชื่อของมันเช่นfind my new file.htmlเมื่อxargsผ่านสิ่งนี้ไปยังgrepฉันได้รับข้อผิดพลาด:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

ฉันสามารถดูสิ่งที่เกิดขึ้นที่นี่: ไปป์หรือxargsคือการรักษาพื้นที่เป็นตัวคั่นระหว่างไฟล์ แต่สำหรับชีวิตของฉันฉันไม่สามารถหาวิธีป้องกันพฤติกรรมนี้ได้ สามารถใช้find+ ได้xargsหรือไม่ หรือฉันต้องใช้คำสั่งที่แตกต่างอย่างสิ้นเชิง?

คำตอบ:


29

ใช้

find ... -print0 | xargs -0 ...

เช่น

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

จากหน้าค้นหาคน

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

คุณไม่จำเป็นต้องใช้xargsเพราะfindสามารถรันคำสั่งได้เอง เมื่อทำสิ่งนี้คุณไม่ต้องกังวลเกี่ยวกับการตีความตัวอักษรของเชลล์ในชื่อ

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

จากหน้าค้นหาคน

คำสั่ง -exec {} +
ตัวแปรของการดำเนินการ -exec นี้รันคำสั่งที่ระบุในไฟล์ที่เลือก แต่บรรทัดคำสั่งจะถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งถูกสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ `{} 'ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น


ฉันจะลงคะแนนให้ แต่ฉันไม่เหลือวันนี้ - ฉันจะทำในวันพรุ่งนี้
user9517 รองรับ GoFundMonica

1
@ ฉัน - คุณไป (ฉันเห็นด้วยวิธี)
Eduardo Ivanec

เพียงแค่ใช้พบว่าคุณยังคงพลาดคุณสมบัติของ xargs รวมทั้งคุณต้องจัดการกับกฎการอ้างอิงที่ไร้สาระ ดูอาร์กิวเมนต์ -P เพื่อ xargs หากคุณมีมากกว่าหนึ่งคอร์ / CPU
Slartibartfast

8

หาก find และ xarg เวอร์ชั่นบนระบบของคุณไม่รองรับ-print0และ-0สวิตช์ (เช่น AIX find และ xargs) คุณสามารถใช้สิ่งนี้:

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

ที่นี่จะคอยดูแลช่องว่างสำหรับ xargs


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