查找时使用print0选项得到的输出更少?


10

我已经阅读了手册页和其他参考资料,但是仍然对find with -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个?


1
从技术上讲,它们是null 终止的,不是null分隔的。(每个路径名(包括最后一个路径名)后都有一个NUL。)
cjm 2012年

Answers:


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 \)

希望可以清楚地说明为什么只有一面打印任何内容。


仅供参考,您可以使用以下方法简化find表达式:find /some/path -iregex '.*intro.*\.jpe?g'...并且由于现在只有一个表达式,它将避免cjm突出显示的问题。
cas 2012年

@cjm括号保存了我的一天,我修复了脚本中的0天错误!
leesei 2015年

@mltsy,它不会混淆,它的正则表达式;-)。
leesei 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.