find 时使用 print0 选项输出较少?

For*_*ker 12 find

我已经阅读了手册页和其他参考资料,但我仍然对 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).
Run Code Online (Sandbox Code Playgroud)

第一条命令:

$ 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
Run Code Online (Sandbox Code Playgroud)

第二个命令:

$ 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
Run Code Online (Sandbox Code Playgroud)

我可以看到第二个命令中的文件名是空字符分隔的,但是为什么我得到 3 个输出而不是上面的 5 个?

cjm*_*cjm 13

你的第一个例子

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg"
Run Code Online (Sandbox Code Playgroud)

不等于

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" -print
Run Code Online (Sandbox Code Playgroud)

它相当于

 find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print
Run Code Online (Sandbox Code Playgroud)

当您的表达式包含除 之外的任何操作时-purge,不再添加隐式打印。你要

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

您只获得 3 个文件名的原因是那些与您的第二个条件(具有操作的条件)匹配的文件名。你输入的真正含义

find /some/path/ \( -iname "*intro*jpeg" \) -o \( -iname "*intro*jpg" -print0 \)
Run Code Online (Sandbox Code Playgroud)

这有希望说明为什么只有 1 面打印任何东西。