You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Linux Shell脚本查找envadmin所有不可写目录

我来帮你搞定这个问题!你想要查找用户envadmin拥有,但当前用户没有写入权限的目录对吧?咱们先修正你之前的思路,给你两种可靠的实现方式:

方法一:用find直接完成(推荐)

你之前的find命令思路是对的,但可能是对-writable的理解或者环境支持问题。我们可以用更通用的写法:

如果要找「属于envadmin,且当前用户无写入权限」的目录

# 查找当前目录下(仅一级)符合条件的目录
find . -type d -maxdepth 1 -user envadmin ! -w
  • -type d:只匹配目录
  • -maxdepth 1:限制只查找当前目录的直接子目录(不递归)
  • -user envadmin:筛选属于envadmin的目录
  • ! -w:取反,匹配当前用户没有写入权限的目录(-w是POSIX标准测试,比-writable兼容性更好)

如果你的需求是「属于envadmin,但envadmin自己没有写入权限」的目录

如果是这个场景(比如目录权限是r-x------,所有者envadmin只能读不能写),可以用:

find . -type d -maxdepth 1 -user envadmin ! -perm -u=w
  • ! -perm -u=w:匹配所有者(u)没有写入(w)权限的目录

方法二:修复你的循环脚本

你之前的for循环里有个错误:[ $directory -user envadmin ]是无效的,因为shell的test命令([ ])不支持-user选项。我们可以用stat命令来获取目录的所有者,修正后的脚本:

# 只遍历当前目录下的子目录(加/避免匹配文件)
for directory in */; do
  # 获取目录的所有者(GNU/Linux版本)
  dir_owner=$(stat -c '%U' "$directory")
  # 如果是BSD/macOS系统,替换成下面这行:
  # dir_owner=$(stat -f '%Su' "$directory")
  
  if [ "$dir_owner" = "envadmin" ]; then
    # 检查当前用户是否无法写入该目录
    if [ ! -w "$directory" ]; then
      echo "Directory: $directory belongs to envadmin but is not writable by current user"
    fi
  fi
done
  • 用*/遍历目录,避免匹配普通文件
  • 变量加双引号,防止目录名含空格等特殊字符时出错

为什么你之前的写法有问题?

  1. ! -writable:这个是GNU find的扩展选项,部分非GNU环境(比如BSD)不支持,换成标准的! -w兼容性更好
  2. 循环里的[ $directory -user envadmin ]:shell的test命令没有-user测试选项,必须用stat或find来判断文件所有者

内容的提问来源于stack exchange,提问作者user2363969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:53:12