มีเอาต์พุตน้อยลงเมื่อใช้ตัวเลือก print0 เมื่อค้นหาใช่ไหม


10

ฉันได้อ่าน man page และข้อมูลอ้างอิงอื่น ๆ แล้ว แต่ฉันยังสับสนกับพฤติกรรมการค้นหาพร้อม-print0ตัวเลือก

-print0      This primary always evaluates to true.  It prints the pathname of
             the current file to standard output, followed by an ASCII NUL
             character (character code 0).

คำสั่งแรก:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null
/some/path//asdf199Intro-5kqlw.jpeg
/some/path/199intro-2jjaj.JPEG
/some/path/199intro-3.jpg
/some/path/wuer199intro-4.JPG
/some/path/xbzf199INTRO-1.jpg

คำสั่งที่สอง:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null -print0
/some/path/136intro-3.jpg/some/path/wuer136intro-4.JPG/some/path/xbzf136INTRO-1.jpg

ฉันเห็นได้ว่าชื่อไฟล์จากคำสั่งที่สองแยกจากกันเป็นโมฆะ แต่ทำไมฉันถึงได้ 3 เอาต์พุตเมื่อเทียบกับ 5 ด้านบน


1
เทคนิคที่พวกเขากำลัง null ยกเลิกไม่ null แยกออกจากกัน (มี NUL ทุกครั้งหลังจากพา ธ รวมถึงคนสุดท้ายคือ.)
CJM

คำตอบ:


12

ตัวอย่างแรกของคุณ

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg"

ไม่เท่ากับ

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" -print

มันเทียบเท่ากับ

 find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print

เมื่อนิพจน์ของคุณมีการกระทำอื่นนอกเหนือจาก-purgeนั้นการพิมพ์โดยนัยจะไม่ถูกเพิ่มอีก คุณต้องการ

find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print0 2> /dev/null

เหตุผลที่คุณได้รับ 3 ชื่อไฟล์เท่านั้นคือสิ่งเหล่านั้นตรงกับเงื่อนไขที่สองของคุณ (อันที่มีการกระทำ) สิ่งที่คุณพิมพ์หมายถึงจริงๆ

find /some/path/ \( -iname "*intro*jpeg" \) -o \( -iname "*intro*jpg" -print0 \)

ซึ่งหวังว่าจะทำให้ชัดเจนว่าทำไมด้านใดด้านหนึ่งเพียงพิมพ์อะไร


FYI คุณสามารถทำให้การค้นหานิพจน์ง่ายขึ้นด้วย: find /some/path -iregex '.*intro.*\.jpe?g'... และเนื่องจากขณะนี้มีเพียงนิพจน์เดียวมันจะหลีกเลี่ยงปัญหาที่เน้นโดย cjm
cas

@cjm วงเล็บบันทึกวันของฉันฉันแก้ไขข้อบกพร่อง 0 วันในสคริปต์ของฉัน !!!
leesei

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