简体   繁体   中英

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM