编写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
- 用
*/遍历目录,避免匹配普通文件 - 变量加双引号,防止目录名含空格等特殊字符时出错
为什么你之前的写法有问题?
! -writable:这个是GNU find的扩展选项,部分非GNU环境(比如BSD)不支持,换成标准的! -w兼容性更好- 循环里的
[ $directory -user envadmin ]:shell的test命令没有-user测试选项,必须用stat或find来判断文件所有者
内容的提问来源于stack exchange,提问作者user2363969
相关产品推荐
相关产品推荐

