Получил меньше вывода с опцией print0 при поиске?

10

Я прочитал справочную страницу и другие ссылки, но меня все еще смущает поведение find с -print0option.

-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 выше?

Forethinker
источник
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 \)

Надеемся, что это объясняет, почему только одна сторона печатает что-либо.

CJM
источник
К вашему сведению, вы можете упростить выражение find с помощью: find /some/path -iregex '.*intro.*\.jpe?g'... и, поскольку теперь есть только одно выражение, это позволит избежать проблемы, выделенной cjm.
Cas
@cjm скобки спасли мой день, я исправил 0-дневную ошибку в моем скрипте !!!
Leesei
@mltsy это не смущает, его регулярное выражение ;-).
Leesei