为什么找不到让我匹配多个模式?

Cor*_*lks 6 unix macos bash shell zsh

我正在写一些处理一些文件的bash/zsh脚本.我想为某个类型的每个文件执行一个命令,其中一些命令重叠.当我尝试时find -name 'pattern1' -or -name 'pattern2',只使用最后一个模式(pattern1不返回匹配的文件;只匹配文件pattern2).我想要的是匹配pattern1pattern2匹配的文件.

例如,当我尝试以下操作时,这就是我得到的(仅./foo.xml发现并打印通知):

$ ls -a
.        ..       bar.html foo.xml
$ tree .
.
??? bar.html
??? foo.xml

0 directories, 2 files
$ find . -name '*.html' -or -name '*.xml' -exec echo {} \;
./foo.xml
$ type find
find is an alias for noglob find
find is /usr/bin/find
Run Code Online (Sandbox Code Playgroud)

使用-o而不是-or给出相同的结果.如果我切换-name参数的顺序,那么只bar.html返回而不是foo.xml.

动画版

为什么不bar.htmlfoo.xml找到并归还?我如何匹配多个模式?

anu*_*ava 8

您需要在find命令中使用括号来对条件进行分组,否则只有第二个-name选项对-exec命令有效.

find . \( -name '*.html' -or -name '*.xml' \) -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)