Re: How to find directories that only contain a certain type of files (e.g., .txt)?

raf <[email protected]>
Newsgroups gmane.comp.gnu.findutils.bugs
Message-ID <ZQDwfev3sJgjmrZ/@raf.org>
On Tue, Sep 12, 2023 at 06:39:32PM +0200, Andreas Metzler <[email protected]> wrote:

> On 2023-09-12 Peng Yu <[email protected]> wrote:
> > Hi,
> 
> > How to find directories that only contain a certain type of files (e.g., .txt)?
> 
> > One idea that I have is to just search for all files' paths. Then use
> > a post-processing script to analyze which directories only contain
> > files of a certain type (e.g., .txt extension).
> 
> > Does anybody have a better idea of how to do this search?
> 
> find -name '*.txt' -printf '%h\n' | sort -u
> 
> (Actually you should use \0 and sort -u --zero-terminated and work on
> that nul-terminated list.)
> 
> cu Andreas

That will list directories that contain .txt files,
not directories that *only* contain .txt files.

This should do it (assuming filenames without newlines):

  find . -type d -exec sh -c '[ "$(find {} -mindepth 1 -maxdepth 1 | wc -l)" = "$(find {} -mindepth 1 -maxdepth 1 -type f -name "*.txt" | wc -l)" ]' \; -print

It lists directories that contain only *.txt files (i.e. no other
files and no subdirectories). If it needs to ignore subdirectories
and only exclude non-.txt files:

  find . -type d -exec sh -c '[ "$(find {} -mindepth 1 -maxdepth 1 -type f | wc -l)" = "$(find {} -mindepth 1 -maxdepth 1 -type f -name "*.txt" | wc -l)" ]' \; -print

But even that's not complete. It'll report empty directories (because 0 == 0), so:

  find . -type d -exec sh -c \ '[ "$(find {} -mindepth 1 -maxdepth 1 -type f -name "*.txt" | wc -l)" -gt 0 ] && [ "$(find {} -mindepth 1 -maxdepth 1 -type f | wc -l)" = "$(find {} -mindepth 1 -maxdepth 1 -type f -name "*.txt" | wc -l)" ]' \; -print

cheers,
raf
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.