2009-07-06 44 views
27

有時我知道一個文件不是很深,但是一個非常密集的子目錄不允許我找到我想要的文件。可以'查找'或任何其他工具搜索文件寬度優先嗎?

可以find(或任何其他工具)使用廣度優先搜索查找文件嗎?

+1

如果你還在尋找這樣的東西,我寫了[this](https://github.com/tavianator/bfs) – 2016-04-05 20:37:39

+0

並掌握** find **命令的「prune」選項你在這裏。在某種程度上陷入困境時沒有意義 - 當你知道目標文件或目錄時,首先尋找一些根深蒂固,高度填充的目錄子樹,而不是找到它。 – 2014-03-11 15:23:58

回答

16

是的,有點。

您可以使用-depth選項使它在目錄本身之前處理目錄的內容。您也可以使用-maxdepth選項來限制它將鑽取的目錄數量。

+2

「排序」是正確的 - 這仍然不是真正的廣度優先搜索,因爲a/b/c將在a/d之前訪問。不過,對於大多數用途來說,這已經足夠了 – ephemient 2009-07-06 15:09:59

4

使用find--maxdepth選項。

這就是參考頁面的Directories部分;可能會根據您的需求找到更適合的其他選項。

要實現精確寬度首先搜索,您需要循環混合使用--mindepth--maxdepth選項。但是,我認爲沒有必要這麼做,深度搜索通常就足夠了。

7

可怕的黑客,不會-0或大於-print,效率低下,等等等等其他任何行動工作...

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

基本上這只是運行

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

直到find返回非零狀態或打印任何東西。

5

使用變量作爲隊列的寬度優先查找。

創建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

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

它使用find來列出所有文件。第一個awk命令計算所有'/'字符。它對計數進行排序,然後刪除計數列。最後它使用xargs來grep排序的文件列表。

這真的很醜。