有时我知道一个文件不是那么深,但是一个非常密集的子目录不允许我轻易找到我想要的文件。
可以使用广度优先搜索查找(或任何其他工具)文件吗?
是的,有点。
您可以使用该-depth
选项使其在目录本身之前处理目录的内容。您还可以使用该-maxdepth
选项来限制将向下钻取的目录数量。
可怕的 hack,无法使用或除、低效
-0
等以外的任何操作……</p>-print
#!/bin/bash
i=0
while results=$(find -mindepth $i -maxdepth $i "$@") && [[ -n $results ]]; do
echo "$results"
((i++))
done
基本上这只是运行
find -mindepth 0 -maxdepth 0
find -mindepth 1 -maxdepth 1
find -mindepth 2 -maxdepth 2
…………………………………………………………………………
直到find
返回非零状态或不打印任何内容。
使用变量作为队列的广度优先查找。
创造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
使其可执行:
$ chmod u+x ./bfs.sh
然后,您可以通过以下方式进行广度优先查找:
$ ./bfs.sh /path/to/somewhere -name foobar
find
与--maxdepth
选项 一起使用。
那是在您的参考页面的目录部分;可能会根据您的需要找到其他更合适的选项。
要实现精确的广度优先搜索,您需要循环使用混合--mindepth
和--maxdepth
选项。但是,我认为没有必要那么精确,深度有限的搜索通常就足够了。
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n | awk '{print $2}' | xargs grep -d skip "search term"
它使用 find 列出所有文件。第一个 awk 命令计算所有的 '/' 字符。它对计数进行排序,然后删除计数列。最后,它使用 xargs 来 grep 排序的文件列表。
真的很丑。