为什么-name有效但我不能在Mac终端中使用-regex?

时间:2016-08-29 14:15:41

标签: regex bash macos file find

在运行Yosemite的Mac上,我的桌面上有一个文件目录:

29_foo10.bar
29_foo2.bar
29_foo20.bar
29_foo3.bar

我希望在foo之后使用单个数字定位文件。当我使用find -name时,我可以使用以下命令选择文件:

USERNAME=darthvader
DIRECTORY="/Users/$USERNAME/desktop/test"
for theProblem in $(find $DIRECTORY -type f -name '29_foo[0-9].bar'); do
    cd $DIRECTORY
    echo $theProblem
done

我在终端(29_foo2.bar& 29_foo3.bar)中返回了两个文件,但是当我尝试使用-regex时它没有返回任何内容,代码:

for theProblem in $(find $DIRECTORY -type f -regex '29_foo[0-9].bar'); do
    cd $DIRECTORY
    echo $theProblem
done

我做了一些研究,发现OS X Find in bash with regex digits \d not producing expected results

所以我将我的代码修改为:

for theProblem in $(find -E $DIRECTORY -iregex '29_foo[0-9].bar'); do

我回来了:

  

没有这样的文件或目录

所以我试过了:

for theProblem in $(find -E $DIRECTORY -type f -regex '29_foo[0-9].bar'); do

但我仍然得到:

  

没有这样的文件或目录

所以我做了一些进一步的研究,找到了bash: recursively find all files that match a certain pattern并进行了测试:

for theProblem in $(find $DIRECTORY -regex '29_foo[0-9].bar'); do

我回来了:

  

没有这样的文件或目录

在兔子洞的下方,我找到了How to use regex in file find所以我试过了:

for theProblem in $(find $DIRECTORY -regextype posix-extended -regex '29_foo[0-9].bar'); do

终端告诉我:

  

find:-regextype:unknown primary或​​operator

为什么在Yosemite我无法使用-regex定位文件?当我man regex我退回手册时,我的bash版本是3.2.57。那么为什么-name会在-regex不起作用时发挥作用呢?

1 个答案:

答案 0 :(得分:2)

您应该在find中使用此正则表达式:

find "$DIRECTORY" -type f -regex '.*/29_foo[0-9]\.bar$'

变更是:

    启动时需要
  • .*/,因为在每个文件名之前会有DOT或某个目录路径。
  • 最后添加了锚$,以避免匹配29_foo3.barn,如果此文件名也在那里。
  • DOT需要在-regex中进行转义,否则会与任何角色匹配。
  • 以上find命令适用于OSX - find以及gnu - find