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?
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?
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.
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 "$@") && [[ -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.
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
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.
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.