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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.