Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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
4  
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
1  
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
5  
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

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

find . -name "[!.]*"
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.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

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
1  
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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .