find命令从根目录搜索无法找到全部setenv.sh文件,仅指定特定子目录时才能找到
问题场景
我以root身份从根目录/执行find命令查找setenv.sh时,只返回了Jira各独立版本安装目录下的文件:
[root@machine1 ~]# find / -name setenv.sh /opt/atlassian/atlassian-jira-software-8.20.15-standalone/bin/setenv.sh /opt/atlassian/atlassian-jira-software-9.4.11-standalone/bin/setenv.sh /opt/atlassian/atlassian-jira-software-9.4.14-standalone/bin/setenv.sh /opt/atlassian/atlassian-jira-software-9.4.17-standalone/bin/setenv.sh /opt/atlassian/atlassian-jira-software-9.12.4-standalone/bin/setenv.sh /opt/atlassian/atlassian-jira-software-9.14.1-standalone/bin/setenv.sh
但当我直接指定/opt/atlassian/jira/这个子目录搜索时,却能找到另一个预期存在的文件:
[root@machine1 ~]# find /opt/atlassian/jira/ -name setenv.sh /opt/atlassian/jira/bin/setenv.sh
可能的原因及解决方法
出现这种“全局搜不到、指定子目录能搜到”的情况,通常是以下几个常见原因导致的:
符号链接限制:大概率
/opt/atlassian/jira是个软链接(符号链接),默认情况下find从根目录搜索时,虽然会跟随软链接进入目录,但如果链接指向的路径存在跨文件系统、或者系统有特殊配置限制,就会被跳过。你可以先执行ls -l /opt/atlassian/jira确认是否为软链接,如果是的话,给find加上-L参数强制跟随所有符号链接:find / -L -name setenv.sh特殊权限/挂载限制:哪怕是root用户,个别目录可能被设置了特殊属性(比如
chattr加了i锁),或者所在文件系统挂载时用了nosuid/nodev/noexec这类限制参数,导致find无法遍历。可以用ls -ld /opt/atlassian/jira查看目录权限,或者mount命令检查该目录所在分区的挂载参数。find默认排除规则:有些系统会在全局配置(比如
/etc/profile)或者用户环境变量里给find设置默认排除规则,自动跳过某些路径。你可以尝试执行find / -name setenv.sh -print强制打印所有结果,或者检查是否存在$FIND_OPTIONS这类影响find行为的环境变量。
快速验证方法
先确认目标目录是否为软链接:
ls -l /opt/atlassian/jira
如果输出类似lrwxrwxrwx 1 root root 40 Jul 10 12:34 /opt/atlassian/jira -> /opt/atlassian/atlassian-jira-software-9.14.1-standalone,那基本就是软链接的问题,加上-L参数就能搜到目标文件了。
备注:内容来源于stack exchange,提问作者user1917670

