Отримаєте менше виводу з опцією print0 на пошуку?


10

Я прочитав сторінку man та інші посилання, але мене все ще бентежить поведінка пошуку з -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
Технічно вони припиняються до нуля , а не розділяються на нуль. (Існує 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.