使用 find 命令排除
我需要一些幫助才能讓
find
命令在正在處理的腳本中正常工作。我需要能夠排除一些目錄。下面我有我正在做的工作。sudo find / ( -name firefox -o -name thunderbird -o -name seamonkey \) -type f 2>/dev/null|grep -v '(10_Recommended|repo)'
我想排除一些目錄,這樣腳本或
find
命令就不會花這麼長時間。在上面的範例中,我想排除
/export/repo
,它是一個 NFS 掛載,/10_Recommended*
它是 Solaris 伺服器上使用的更新檔集的開始。目前的範例如下:/10_Recommended_CPU_2014-01
.我嘗試過使用
-prune
and!
語句,但它不起作用。有人可以幫我解決這個問題嗎?我正在 Solaris 10、RHEL 5、SLES 11 SP2 上調整此命令。
嘗試添加:
-not -path "/10_Recommended*" -not -path "/export/repo/*"
但要小心,這些儲存庫的路徑取決於您執行 find 命令的位置和方式。
如果你在
/
並且你做了find -name
任何事情,你必須.
在不需要的路徑中添加一個。對你來說,這將是:
find -name whatever -not -path "./10_Recommended*" -not -path "./export/repo/*"
但是如果你
/
在你的 find 命令之後添加了一個like you,你必須刪除這些點:
find / -name whatever -not -path "/10_Recommended*" -not -path "/export/repo/*"
試試這個:
find / \( -path /export -o -path "/*Recommended*" \) -prune -o \ \( -name iceweasel -o -name thunderbird -type f \) -print 2>/dev/null
這裡的原因是
-prune
是一種後綴“動作”,最好與-path
. 首先列出您要忽略的路徑,然後列出您要查找的文件。與其他查找操作的前綴性質相比,這似乎不自然。以這種方式,首先看到路徑被修剪,如果沒有,則執行 -o 開關的“另一端”。反過來,它將首先進行深度搜尋,並且永遠無法達到修剪,或者至少這是我的理解。
無論如何,可移植性都將成為一個問題,尤其是在 Solaris 和 *nix 風格之間。也許你會對 OpenCSW 的版本有一些運氣,
find
但不能保證。編寫一個小的 shell 腳本並檢查作業系統類型uname
,這是一個由來已久的系統管理員傳統。這是我機器上使用 GNU find 的範例:
[fuzzed@ops ~]$ find / -path /usr -prune -o \( -name rsync -o -name bash \) -print 2>/dev/null [fuzzed@ops ~]$ find / -path /usr/share -prune -o \( -name rsync -o -name bash \) -print 2>/dev/null /usr/bin/bash /usr/bin/rsync
我的
find
版本:[fuzzed@ops ~]$ find --version find (GNU findutils) 4.5.11
此外,一些謂詞支持萬用字元或正則表達式,所以也檢查一下。