39

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 --- ex-moderator kitten Jun 16 '10 at 0:32
  • 2
    Question: do you want to hide something like .hidden/visible.txt? – Keith Thompson Oct 13 '11 at 0:20
15

I found this here:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
| improve this answer | |
  • Why not just \( ! -name '.*' \)? – user1686 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. – user1686 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.... – Nandhini Anand Jun 30 '11 at 8:27
17

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

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

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.

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

Try the following find usage:

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

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

| improve this answer | |
2

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.

| improve this answer | |
2

To find hidden files:

find -name '[.]*'

To find visible files:

find -name '[!.]*'

It is that simple.

| improve this answer | |
1

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.

| 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 Says 'Reinstate Monica' Oct 22 '14 at 16:42
1

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.

| improve this answer | |

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.