Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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

3 Answers 3

up vote 11 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
3  
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.... –  Anand Jeyahar 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

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
    
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 at 16:42

Your Answer

 
discard

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.