gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:08:20 27 4
gpt4 key购买 nike

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

我知道我可以这样做以按名称排除多个目录之一:
find / -mount -local \( -type d -a \( -name dir1 -o -name dir2 -o dir3 \) \) -prune -o \( -nouser -o -nogroup \) -print
但是,这将匹配任何目录的目录结构中的任何位置的 dir1 和 dir2,即 不是 我想要什么。

我希望能够阻止 find 甚至在以下目录中搜索(例如):

/opt/dir1
/opt/dir2
/var/dir3/dir4

而且我仍然希望它在以下目录中找到无主文件和目录:
/opt/somedir/dir1
/var/dir2
/home/user1/dir1

我曾尝试在 -name 参数中使用正则表达式,但由于 find 仅将“名称”与所找到的基本名称匹配,因此我无法指定路径。不幸的是,Solaris 的 find 不支持 GNU find 选项,例如 -wholename 或 -path,所以我有点搞砸了。

我的目标是拥有一个具有以下语法的脚本:
script.sh "/path/to/dir1,/path/to/dir2,/path/to/dir3"
我如何在 Solaris(5.8 及更高版本)上使用 find 和标准 sh 脚本(/bin/sh)来做到这一点?

最佳答案

您无法通过完整路径将文件与 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 中的函数模块。

关于scripting - 如何在 Solaris 上的 find 命令中排除完整目录路径列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854975/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com