如何在Bash脚本中检查所有子文件夹及文件归属特定用户
刚好之前处理过类似的需求,给你整理了一个可靠的bash脚本实现,完全满足你遍历指定目录、检查所有文件/文件夹所有者的要求:
需求明确
我们需要实现的核心功能:遍历指定基础文件夹的所有子文件夹及文件,只要存在任何所有者不是my_user的项,就返回失败(对应bash里的非0退出码)。
完整实现脚本
这里是经过优化调整的版本,修复了原示例里的递归返回值处理、空目录通配符匹配等小问题:
#!/bin/bash checkOwnerShipOfFiles () { local files=$1 for f in $files; do # 跳过不存在的路径(比如空目录下的通配符会变成字面量,直接跳过) [ -e "$f" ] || continue # 获取当前路径的所有者用户名 local owner=$(stat -c %U "$f") # 检查所有者是否符合要求 if [ "$owner" != "my_user" ]; then echo "Invalid owner: $owner of path $f" return 255 # 返回非0值代表检查失败 fi # 如果是目录,递归检查其下所有内容 if [ -d "$f" ]; then checkOwnerShipOfFiles "$f/*" local ret=$? # 只要递归检查失败,就立即向上传递失败状态 if [ $ret -ne 0 ]; then return $ret fi fi done return 0 # 所有项检查通过,返回0代表成功 } # -------------------------- # 调用示例:替换为你的目标目录 # -------------------------- TARGET_DIR="/path/to/your/base/folder" if checkOwnerShipOfFiles "$TARGET_DIR/*"; then echo "✅ All files and folders under $TARGET_DIR are owned by my_user" else echo "❌ Found files/folders with invalid owner under $TARGET_DIR" exit 1 fi
脚本关键细节说明
- 递归遍历逻辑:函数
checkOwnerShipOfFiles通过调用自身,实现对目录的深度优先遍历,确保每个子目录和文件都被检查到 - 所有者检查:使用
stat -c %U "$f"命令获取文件/目录的用户名,和目标用户my_user做字符串对比 - 快速失败机制:一旦发现不符合要求的所有者,立即返回255并终止检查,避免不必要的遍历
- 边界情况处理:添加了
[ -e "$f" ] || continue,解决空目录下通配符*会被当作普通字符串处理的问题
使用注意事项
- 执行脚本的用户需要有目标目录下所有文件/文件夹的读取权限,否则
stat命令会报错,导致检查中断 - 如果目标目录路径包含空格,一定要用双引号包裹参数(比如
checkOwnerShipOfFiles "/my folder with spaces/*") - 可以直接修改脚本里的
my_user为你实际需要检查的目标用户名
内容的提问来源于stack exchange,提问作者Nixxon
相关产品推荐
相关产品推荐

