Linux

使用 find 命令排除

  • March 17, 2014

我需要一些幫助才能讓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.

我嘗試過使用-pruneand!語句,但它不起作用。有人可以幫我解決這個問題嗎?

我正在 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

此外,一些謂詞支持萬用字元或正則表達式,所以也檢查一下。

引用自:https://serverfault.com/questions/581888