使用 find 命令排除

使用 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!语句,但不起作用。有人能帮我解决这个问题吗?

我正在 Solaris 10、RHEL 5、SLES 11 SP2 上调整此命令。

答案1

尝试添加:

-not -path "/10_Recommended*" -not -path "/export/repo/*"

但要小心,这些存储库的路径取决于您在何处以及如何执行 find 命令。

如果您在/并且做了任何事情,那么您必须在不需要的路径中find -name添加一个。.

对于你来说,这将是:

find -name whatever -not -path "./10_Recommended*" -not -path "./export/repo/*"

/但是如果你在 find 命令后添加了像你这样的人,你必须删除这些点:

find / -name whatever -not -path "/10_Recommended*" -not -path "/export/repo/*"

答案2

尝试这个:

find / \( -path /export -o -path "/*Recommended*" \) -prune -o \
  \( -name iceweasel -o -name thunderbird -type f \) -print 2>/dev/null

这里的原因是, 是-prune一种后缀“操作”,最好与 结合使用-path。首先列出要忽略的路径,然后列出要查找的文件。与其他 find 操作的前缀性质相比,这似乎不自然。

以这种方式,路径首先被修剪,如果没有被修剪,则执行 -o 开关的“另一侧”。相反,它将首先进行深度搜索,并且永远不会达到修剪,至少这是我的理解。

无论如何,可移植性都会成为问题,尤其是在 Solaris 和 *nix 版本之间。也许你会幸运地使用findOpenCSW 中的版本,但不能保证。编写一个小的 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

此外,一些谓词支持通配符或正则表达式,因此也请检查一下。

答案3

感谢大家的帮助。下面我发布了问题的答案,或者至少是对我有用的答案。我在 Solaris 10、RHEL 5 和 SLES 11.2 服务器上测试了以下 find 命令。

所以下面我展示了最终的查找命令。

搜索 Java

# find / \( -name 10_Recommended* -o -name share \) -prune -o -type f -name java -print 2>/dev/null

搜索 Mozilla 应用程序

# find / \( -name 10_Recommended* -o -name share \) -prune -o -type f \( -name firefox -0 -name thunderbird -0 -name seamonkey \) -print 2>/dev/null

我希望有人觉得这有用。

相关内容