我需要一些帮助才能让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 版本之间。也许你会幸运地使用find
OpenCSW 中的版本,但不能保证。编写一个小的 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
我希望有人觉得这有用。