2011-10-21 32 views
4

排除在find命令完整的目錄路徑列表,我有一個非常具體的需要找到無主文件和目錄在Solaris上使用一個腳本,需要能夠從查找排除完整的目錄路徑,因爲他們包含潛在的數千個無主文件(這是正常的,因爲它們是託管在其他服務器上的文件)。我甚至不希望找到這些目錄中進行搜索,因爲它會掛在服務器(CPU扣球99%長一段時間),因此管道的查找結果中的egrep過濾掉這些目錄是不是一種選擇。如何在Solaris

我知道我能做到這一點的名字排除多個目錄中的一個:

find/-mount -local \(-type d -a \(-name dir1 -o -name dir2 -o dir3 \) \) -prune -o \(-nouser -o -nogroup \) -print

然而,這將匹配DIR1和DIR2在任何目錄的目錄結構,這是任何地方我想要什麼。

我希望能夠防止查找在以下目錄中甚至搜索(爲例):

/opt/dir1 
/opt/dir2 
/var/dir3/dir4 

我仍然希望它發現在以下目錄無主文件和目錄:

/opt/somedir/dir1 
/var/dir2 
/home/user1/dir1 

我已經嘗試在名稱參數中使用正則表達式,但自從找到匹配的名稱對其所發現的基名稱,我無法指定路徑。不幸的是,Solaris的find不支持GNU查找選項,如-wholename或-path,所以我有點搞砸了。

我的目標是將有以下語法的腳本:

script.sh "/path/to/dir1,/path/to/dir2,/path/to/dir3"

我怎麼能這樣做使用查找和Solaris上標準的SH腳本(/ bin/sh的)(5.8及以上) ?

+1

開始'find'從 '/' 是有問題的。腳本中的預處理步驟,它只抓取頂層路徑元素,即。/opt,/ var,然後在排除不感興趣的目錄之後,爲這些目錄運行查找?只是一個想法,祝​​你好運!如果您想出自己的解決方案,請發帖,因爲這是一個有趣的問題。如果您在http://unix.stackexchange.com/上發帖,您可能會更多地注意到這一點。 – shellter

+0

從/開始實際是必需的。該腳本的目的是生成審計合規結果,其中列出了我們爲客戶支持的服務器中的所有無主文件和目錄,但不知道它們的位置。我們確實知道有一些我們從不想掃描的目錄(/ proc,/ dev,remote mounts等等),但我們總是需要掃描一切。我們對使用包含列表進行了很多考慮,而不是排除列表,並且我們別無選擇,只能使用排除選項,因爲它是覆蓋最多未知案例的一個(仍然在跟蹤我?)。 –

+0

只是重複上unix.stackexchange.com出任建議:_http://unix.stackexchange.com/questions/23077/how-to-exclude-a-list-of-full-directory-paths-in-find-命令上solaris_發佈 –

回答

2

無法通過完整路徑與Solaris find匹配的文件,但可以通過索引節點相匹配的文件。因此,使用ls -i產生的inode的列表進行修剪,然後調用find。這假定沒有太多的目錄需要修剪,以至於要超過命令行長度限制。

inode_matches=$(ls -bdi /opt/dir1 /opt/dir2 /var/dir3/dir4 | 
       sed -e 's/ *\([0-9][0-9]*\) .*/-inum \1 -o/') 
find/-xdev \($inode_matches -nouser -o -nogroup \) -prune -o -print 

另一種方法是使用Perl或Python腳本並滾動自己的目錄遍歷。 Perl中附帶了可以讓你與File::Find模塊開始find2perl腳本。在Python中,請參閱os.path模塊中的walk函數。

+0

去測試它,讓你知道它是如何工作的。不用擔心,如果這樣做很好,我會很樂意接受答案! –

+0

工作得很好!不過,我用awk替換了sed以達到我的目的:'exclude_dirs_inums ='ls -bdi $ exclude_dirs 2>/dev/null | awk'{print $ 1}'| tr'\ n'','| sed -e's /,$ //'| SED -e「S /,/ -o -inum/g''然後我填用表達該變量是'f_exclude_dirs = 「(-inum $ exclude_dirs_inums)-prune -o」'。 (很抱歉的格式,但有太多的反引號在我的代碼...) –

+0

@YanickGirouard提示:使用'$(...)'。不僅更容易與降價協調,而且還可以讓您在引用替代命令時引發頭痛。你似乎經歷了很多障礙,以避免最後一個'-o'。將'-e'$ s/-o //''添加到'sed'的參數將會簡單很多。 – Gilles