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

  • 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 15 down vote accepted

I found this here:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
  • 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.

  • This was the only one of the one liners that worked for me. – entpnerd Aug 8 '16 at 9:06

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

find . -name "[!.]*"

Try the following find usage:

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

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

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.

  • 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

If you aims is to find and grep, ripgrep does exclude hidden files by default, e.g.

rg --files

--files Print each file that would be searched without actually performing the search.

fd

Use fd, a simple, much faster and user-friendly alternative to find. By default, it:

  • Ignores hidden directories and files, by default.
  • Ignores patterns from your .gitignore, by default.

Check the Benchmark analysis.

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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