10.7 当表达式中只有一个为true时就显示结果(OR)

find -o

在10.4节中,可以使用find命令,把London Calling中大小为10 MB的Clash的所有歌曲文件都找出来,而且也可以使用find命令把London Calling中大小超过10 MB的歌找出来,但是用-size选项不能二者兼得。在10.6节中,-a选项使用AND来组合选项。不过,也可以使用-o(或-or)选项,用OR来组合各个选项。

因此,为了从London Calling中查找文件大小等于或大于10 MB的歌曲文件,可以使用以下命令:

  1. $ cd London_Calling
  2. $ find . -size +10M -o -size 10M
  3. 03_-_Jimmy_Jazz.ogg
  4. 07_-_The_Right_Profile.ogg
  5. 08_-_Lost_In_The_Supermarket.ogg
  6. 09_-_Clampdown.ogg
  7. 12_-_Death_Or_Glory.ogg
  8. 15_-_Lover's_Rock.ogg
  9. 18_-_Revolution_Rock.ogg
  10. (25th_Anniversary)_-_18_-_Revolution_Rock.mp3
  11. (25th_Anniversary)_-_37_-_Heart_And_Mind.mp3
  12. (25th_Anniversary)_-_ 39_-_London_Calling_(Demo).mp3

哎呀,搜索结果中还包括London Calling的25周年纪念版,我们不想要这个。现在需要做两件事:一是从结果中排除25周年纪念版的信息,二是确保OR语句运行正常。

要排除25周年纪念版的歌曲,在命令行的末尾增加!-name "*25*"。要确保OR语句运行正常,需要用括号把它括起来,对语句进行组合。不过,需要使用反斜杠(\)对括号进行转义,这样shell才不会误解它们,而且还需要在语句前后都留下空格。组合后的命令如下所示:

  1. $ cd London_Calling
  2. $ find . \( -size +10M -o -size 10M \) ! -name
  3. "*25*"
  4. 03_-_Jimmy_Jazz.ogg
  5. 07_-_The_Right_Profile.ogg
  6. 08_-_Lost_In_The_Supermarket.ogg
  7. 09_-_Clampdown.ogg
  8. 12_-_Death_Or_Glory.ogg
  9. 15_-_Lover's_Rock.ogg
  10. 18_-_Revolution_Rock.ogg

好极了。有7首大小等于或超过10 MB的歌。

说明 有关London Calling的更多信息,可以访问Allmusic.com(www.allmusic.com/cg/amg.dll?p=amg&sql=10:aeu1z82ajyvn)或Pitch- fork (www.pitchforkmedia.com/record-reviews/c/clash/london-calling.shtml)。

也可以用-o找出music盘中有多少首歌。从/media/music的根目录下运行命令,并使用-a选项(耐心点,一会就要使用-o了),如下所示:

  1. $ find . -name "*mp3*" -a -type f | wc -l
  2. 23407

23 000个结果? 结果不对。刚才只搜索了mp3文件,而大量歌曲是以更高级的Ogg Vorbis格式编码的(这是一种可以取代mp3的、专利免费的开源格式)。搜索mp3或ogg文件,并用wc l统计结果,如下所示:

  1. $ find . \( -name "*mp3*" -o -name "*.ogg*" \) -a
  2. ➥-type f | wc -l
  3. 41631

看起来好多了,但还有一些FLAC文件没有包括进来。再添加一个-o选项,如下所示:

  1. $ find . \( -name "*mp3*" -o -name "*.ogg*" -o -name
  2. "*.flac*" \) -a -type f | wc -l
  3. 42187

现在得到的结果更棒了:有42 000首歌,而且数量还在增长。