我非常特别需要使用脚本在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)来做到这一点?
答案 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
函数。