2011-08-04 186 views
2

我正在嘗試執行find,我可以在目錄結構中指定通配符,然後在數據目錄中的所有文件中爲www.domain.com執行grep。Unix查找通配符目錄結構

find /a/b/c/*/WA/*/temp/*/*/data -type f -exec grep -l "www.domain.com" {} /dev/null \; 

這工作得很好,有C/*/WA之間只有一個可能的水平。

我該如何去做同樣的事情,在C/*/WA之間可能存在多個級別?

所以它可能是在

/a/b/c/*/*/WA/*/temp/*/*/data 

/a/b/c/*/*/*/WA/*/temp/*/*/data 

沒有定義/c//WA/之間的目錄數;可能有多個級別,每個級別都可能有/WA/*/temp/*/*/data

任何想法如何做這樣的發現?

回答

2

如何使用for循環找到WA目錄,然後再從那裏:

for DIR in $(find /a/b/c -type d -name WA -print); do 
    find $DIR/*/temp/*/*/data -type f \ 
     -exec grep -l "www.domain.com" {} /dev/null \; 
done 

您可以得到所有在單個命令,但我認爲透明度是更重要的長跑。

+0

第二個'find'使得shell做了很多工作,並且使用'find'來檢查'data'實際上是一個常規文件,而不是一個目錄(或者其他'非文件')。 –

+0

我thnk這可能已經工作 - 我只是檢查,看看它是否正確!謝謝! – Mudders

+0

是的,它看起來像這個工作正常!非常感謝! – Mudders

0

假設在路徑沒有空格,那麼我認爲在以下方面:

find /a/b/c -name data -type f | 
grep -E '/WA/[^/]+/temp/[^/]+/[^/]+/data' | 
xargs grep -l "www.domain.com" /dev/null 

這使用find查找文件(而不是讓殼做的大部分工作),然後使用grep -E(相當於egrep)在路徑中選擇具有正確模式的名稱,然後使用xargsgrep(再次)查找目標模式。