如何在Solaris上的find命令中排除完整目录路径列表

时间:2011-10-21 20:33:55

标签: scripting find solaris sh

我非常特别需要使用脚本在Solaris中查找无主文件和目录,并且需要能够从查找中排除完整目录路径,因为它们可能包含数千个无主文件(这是正常的,因为它们是文件托管在其他服务器上)。我甚至不想在这些目录中搜索,因为它会挂起服务器(CPU长时间达到99%),因此在egrep中找到结果来过滤掉那些目录不是一种选择。

我知道我可以这样做以按名称排除一个或多个目录:

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

我尝试在-name参数中使用regex,但由于find只匹配它找到的基本名称的'name',所以我无法指定路径。不幸的是,Solaris的find不支持GNU查找选项,例如-wholename或-path,所以我有点搞砸了。

我的目标是使用以下语法编写脚本:

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

我如何在Solaris(5.8及更高版本)上使用find和标准sh脚本(/ bin / sh)来做到这一点?

1 个答案:

答案 0 :(得分:2)

您无法通过Solaris find的完整路径匹配文件,但您可以按inode匹配文件。因此,使用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附带一个find2perl脚本,可以帮助您开始使用File::Find模块。在Python中,请参阅walk模块中的os.path函数。