Re: Using .ignore file in find

Bernhard Voelker <[email protected]>
Newsgroups gmane.comp.gnu.findutils.bugs
Message-ID <[email protected]>
On 2/13/25 09:16, Grigorii Sokolik wrote:
> Dear findutils maintainers team!
>
> In the software development world there is a widespread practice of using
> ignore files. Examples are:
>    - .gitignore
>    - .dockerignore
>    - .clang-format-ignore
>    - ...
> All of them have the same syntax and the same logic. It would be super
> great if it would be possible to use the same syntax file in find for
> listing ignored files or unignore files
>
> Use cases:
>
> # list all ignored files
> find . -type f -name .gitignore | sed
> 's/\(.*\.gitignore\)/--match-patterns \1/' | xargs find . -type f
>
> # list all files not violating the rules
> find . -type f -name .my-fancy-system-ignore | sed
> 's/\(.*\.my-fancy-system-ignore\)/--ignore-patterns \1/' | xargs find . |
> xargs add_file_to_my_fancy_system_context
>
> What should I do to make it possible? I could try to implement it myself,
> but I would like to discuss this feature first.

It's tempting to read in white- or black-lists via a file or file descriptor.
E.g. rsync(1) has --exclude-from=FILE and --include-from=FILE (and FWIW the
--cvs-exclude option).
Also grep(1) has --exclude-from=FILE.

What I'm worried about is being hooked on certain input file formats of
various seemingly similar systems:

While - as far as I know - CVS only allowed patterns for regular files,
.gitignore files allow:
- to distinguish in .gitignore files between files and directories
   ('configure' vs. '.deps/'),
- to bind the pattern to the current directory with a leading slash
   ('/ABOUT-NLS'),
- to specify to ignore files in certain subdirectories
   ('/xargs/test-sigusr'),
- and even to negate with a leading '!'.
Every system or tool will have their own subtleties.

Therefore, I'd rather not add support for specific ignore formats to find(1).
Eventually a --exclude-from=FILE in the style of grep(1) to filter globbing
patterns may make sense.

Re. this one:

 > # list all ignored files

This seems to be feasible with:
   $ find | git check-ignore --stdin

One can feed that into another find(1) with the rather new -files0-from option
for further tests; e.g. in my findutils directory, find all non-versioned files
which are older than 100 days ('check-ignore' seems to have problems with the
'gnulib' submodule, hence the prune-ing):

   $ find -name gnulib -prune -o -print0 \
       git check-ignore -z --stdin \
     | find -files0-from - -mtime +100 -ls
   7995557     48 -rw-r--r--   1 berny    users       49140 Nov 11  2022 ./po/.reference/id.po
   7995578     84 -rw-r--r--   1 berny    users       82251 Nov 28  2022 ./po/.reference/ru.po
   ...

Have a nice day,
Berny
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.