Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

What options do I need to use with find to exclude hidden files?

share|improve this question
Aside: the reason there isn't some special support for this task is that the only thing special about files named with a leading '.' is that there are not listed by ls unless specifically requested: they are completely ordinary files in every respect, its just that ls lets you ignore them by default. – dmckee Jun 16 '10 at 0:32
Question: do you want to hide something like .hidden/visible.txt? – Keith Thompson Oct 13 '11 at 0:20
up vote 14 down vote accepted

I found this here:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
share|improve this answer
Why not just \( ! -name '.*' \)? – grawity Jun 16 '10 at 15:15
@grawity I just found that, I don't know entirely how it works. Would yours not only hide hidden files, but hidden directories and all their sub-content and hidden files in subfolders? – Jarvin Jun 16 '10 at 16:05
No, it wouldn't :/ But \( ! -path '*/.*' \) would. – grawity Jun 16 '10 at 16:38
@grawity Ya, I guess I made an assumption about what the OP wanted... Your -name solution is probably the closest to what they were asking for. – Jarvin Jun 16 '10 at 18:07
@grawity&Dan: Isn't it ( !-path '^.*' ) ?? your solutions will ignore any file that has a '.' anywhere in the file name like a.exe, b.out etc.... – Software Mechanic Jun 30 '11 at 8:27

This doesn't answer your question, but for the task of finding non-hidden files I like to let find find all the files then filter with grep.

find . -type f | grep -v '/\.'

Similar to your approach but perhaps a bit simpler.

share|improve this answer

Try the following find usage:

find . -type f -not -path '*/\.*'

Which would ignore all the hidden files (files and directories starting with a dot).

share|improve this answer

I wrote a script called findnh which I believe handles certain edge cases better than the answers to this question that I've been able to find on the web.


declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

For example, you can find non-hidden files and directories inside of an explicitly-specified hidden directory with a command like findnh ~/.hiddendir/, which will show ~/.hiddendir/file but not ~/.hiddendir/.superhiddenfile.

share|improve this answer
Nice bit of coding. Except, when I try findnh ~/.hiddendir/, I get nothing. Other than that, how is this different from ! -path '*/.*' and find … | grep -v '/\.'? – G-Man Oct 22 '14 at 16:42

It seems negation glob pattern is not well known. So you can use:

find . -name "[!.]*"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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