2012-04-11 84 views
3

我有一個簡單的查找命令,需要通過服務器上的數百萬文件,並找到一些給定的後綴。這些文件經常被寫入並刪除。我只是想知道是否有一種方法可以更快地找到答案。使用定位是沒有問題的,因爲爲定位創建數據庫將非常昂貴。快速shell找到

find /myDirWithThausandsofDirectories/ -name *.suffix 

在某些服務器上,該命令需要幾天時間!

有什麼想法?

謝謝,

+0

這就是你所能做的一切。 find會爲你迭代目錄,但是由於目錄項的存儲方式,在unix系統上通過'large'目錄會很慢。 – 2012-04-11 17:37:30

+0

解決問題? 'find /myDirWith../dira*-name * .suf&find /myDirWith../dirb* -name * .suf ....&'另外,看'gnu-parallel'或'xargs -n'好運氣! – shellter 2012-04-11 17:38:05

+1

也許這是擁有與數百萬個文件不同的東西的好例子,例如GDBM數據庫或像MySQL或PostGresQL這樣的「關係型」數據庫,或像mangodb這樣的noSQL。 – 2012-04-11 18:42:32

回答

2

您可以使用審計子系統來監視文件的創建和刪除。結合初始運行find,您應該可以創建一個可以實時更新的文件數據庫。

3

分而治之?假設MP os和處理器 爲每個子文件夾產生多個find命令。

for dir in /myDirWithThausandsofDirectories/* 
do find "$dir" -name "*.suffix" & 
done 

取決於你可能需要控制多少進程(find命令)在給定時間運行子目錄的數目。這將有點棘手,但可行(即使用bash shell,保留一個陣列與產生的進程$! pids和只允許新的,取決於數組的長度)。 此外,上述內容不會搜索根目錄下的文件,只是想法的一個簡單示例。

如果你不知道如何完成流程管理,那麼學習的時間;) This是一個非常好的主題文本。 This是你實際需要的東西。但是閱讀整個事情來了解它是如何工作的。

+0

你也可以看看'nice'和'ionice'這樣的東西來給你的腳本以更大的優先權,但我不確定這是否會產生很大的差異,並且很可能使得該機器不能用於其他事情。 – c00kiemon5ter 2012-04-11 17:47:30

+0

我不知道如何控制進程的數量! – Amir 2012-04-11 18:19:49

+1

我編輯了我的答案來協助:) – c00kiemon5ter 2012-04-11 18:32:12

0

由於您使用的是簡單的glob,因此您可能可以使用Bash的遞歸匹配。例如:

shopt -s globstar 
for path in /etc/**/**.conf 
do 
    echo "$path" 
done 

可能更快,因爲它的使用具有比find少得多的靈活性的內部殼能力。

如果您不能使用猛砸,但你有一個限制的路徑深度,可以明確地列出了不同深度:

for path in /etc/*/*.conf /etc/*/*/*.conf /etc/*/*/*/*.conf 
do 
    echo "$path" 
done 
0

下面是代碼:

find /myDirWithThausandsofDirectories/ -d type maxdepth 1 > /tmp/input 
IFS=$'\n' read -r -d '' -a files < /tmp/input 


do_it() { 
    for f; do find $f -name *.suffix | sed -e s/\.suffix//g ; done 
} 

# Divide the list into 5 sub-lists. 
i=0 n=0 a=() b=() c=() d=() e=() 
while ((i < ${#files[*]})); do 
    a[n]=${files[i]} 
    b[n]=${files[i+1]} 
    c[n]=${files[i+2]} 
    d[n]=${files[i+3]} 
    e[n]=${files[i+4]} 
    ((i+=5, n++)) 
done 

# Process the sub-lists in parallel 
do_it "${a[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${b[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${c[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${d[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
do_it "${e[@]}" >> /tmp/f.unsorted 2>/tmp/f.err & 
wait 
echo Find is Done! 

的我唯一遇到的問題是部分文件名(非常小的百分比)。我不知道這是什麼原因!