I'm currently trying to find (and copy) all files and folder structure matching a specific pattern, in a specified directory and I'm so nearly there!

Specifically, I want to recursively copy all folders not begining with a '_' character from a specified path.

find /source/path/with/directories -maxdepth 1 -type d ! -name _\* -exec cp -R {} /destination/path \;

In the /source/path/with/directories/ path are machine-specific directories beginning with '_' and others, and I'm only interested in copying the others. For a reason beyond me, the find command returns the /source/path/with/directories/ directory, and therefore copies its content, directories begining with '_' included.

Anyone have a hint as to why that is?




find returns the root path because it matches your criteria—i.e. it is a directory, and it doesn't start with _.

You're looking for -mindepth 1, I suspect:

$ cd /tmp
$ mkdir a
$ touch a/b
$ mkdir a/c
$ touch a/c/d
$ find a
$ find a -mindepth 1

Reference: find manpage

  • Excellent! works as I wanted. I had it working by adding ! -name 'files' but it felt wrong to me... – Pinpin Jun 20 '12 at 21:47

Change from:

find /source/path/with/directories ...


(shopt -s dotglob; find /source/path/with/directories/* ... )

That way /source/path/with/directories will not be included.

The shopt -s dotglob is so that * will also match files and directories starting with a . (hidden files, directories).

And the whole thing is wrapped in a sub-shell with (...) to limit the effect of shopt only within the sub-shell, otherwise you would have to undo it later with shopt -u dotglob.

  • That will fail for directory entries that start with .. Don't try .*, either, or you'll match a whole lotta other stuff you never intended to. ;-) – zigg Jun 20 '12 at 20:11
  • Good point, updated the answer, added using shopt. – janos Feb 15 '13 at 7:48

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.