3

I've two files in the current folder:

submitWeb.m
submit.m

the following find does not show the two files:

find . -regex .*submit\(Web\)?\.m

But the above regex expression works fine in emacs buffer, i.e., search for the example strings in the emacs buffer using isearch-forward-regexp.

The default regextype for find is emacs.

But it seems that find consider \( as a left bracket in the filename, which differs from emacs regex syntax.

So is this a bug or my misunderstanding of find manpage?

5

It seems that the problem is \( is interpreted by the shell first.

For example, you got a file in the current directory named:

foo(.test

Then

ls foo\(.text

and

ls "foo(.text"

both work.

So, the following works:

find . -regex ".*submit\(Web\)?\.m"

EDIT:

Single quote also works here.

Difference between single quote and double quote, see this post: single quote vs double quote in bash

  • Or put the regex in single quotes instead: find . -regex '.*submit\(Web\)?\.m' – slm May 26 '13 at 1:44
  • @slm Yes, anyway, just prevent the shell from interpreting the \(. Edited. – gongzhitaao May 26 '13 at 4:08
  • 2
    A good rule of thumb is to quote everything in single quotes unless you specifically need the substitution behavior of double quotes. – tripleee May 26 '13 at 11:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.