Home » Linux » Can 'find' or any other tool search for files breadth-first?

Can 'find' or any other tool search for files breadth-first?

Posted by: admin November 30, 2017 Leave a comment

Questions:

Sometimes I know a file is not so deep away, but a very dense sub-directory does not allow me to find the files I want easily.

Can find (or any other tool) look for files using breadth-first search?

Answers:

Yes, sort of.

You can use the -depth option to make it process a directory’s contents before the directory itself. You can also use the -maxdepth option to limit how many directories down it will drill.

Questions:
Answers:

Horrible hack, won’t work with -0 or any actions other than -print, inefficient, etc. etc…

#!/bin/bash
i=0
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do
    echo "$results"
    ((i++))
done

Basically this just runs

find -mindepth 0 -maxdepth 0
find -mindepth 1 -maxdepth 1
find -mindepth 2 -maxdepth 2
…………………………………………………………………………

until find returns non-zero status or prints nothing.

Questions:
Answers:

A breadth-first find using variable as its queue.

Create bfs.sh

#!/bin/bash

queue="$1"
shift

while [ -n "$queue" ]
do
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $*
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d`
done

Make it executable:

$ chmod u+x ./bfs.sh

Then you can do a breadth-first find by:

$ ./bfs.sh /path/to/somewhere -name foobar

Questions:
Answers:

Use find with the --maxdepth option.

That is at the Directories section in your reference page; might find other options more suitable depending on your needs.

To achieve exact breadth first searching, you will need to loop with mixed --mindepth and --maxdepth options. But, I don’t think it is necessary to be that exact, a depth limited search will usually suffice.

Questions:
Answers:
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n  | awk '{print $2}' | xargs grep -d skip "search term"

It uses find to list all the files. The first awk command counts all the ‘/’ characters. It sorts on the count and then drops the count column. Finally it uses xargs to grep the sorted list of files.

It is really ugly.

Leave a Reply

Your email address will not be published. Required fields are marked *