我有几个共享文件夹,我需要查找用户是否在那里有几个文件夹。例如:
/shared/release/
/shared/compile/
/shared/tags/
/shared/general/
我需要一个 bash 脚本来列出这些文件夹并告诉我用户是否拥有超过 1 个文件夹。
使用 bash,如何获取这些文件夹的列表并确定用户是否拥有多个文件夹?
答案1
使用find
:
find /shared -mindepth 1 -maxdepth 1 -type d -user <username>
替换<username>
为您要查找的实际用户名。
-maxdepth 1
将防止递归遍历即只会查看/shared
目录-mindepth 1
/shared
如果拥有的话,将阻止列出目录本身<username>
,如果您不希望此行为,请删除此选项-type d
表示我们只对目录感兴趣-user <username>
表示我们正在寻找<username>
拥有的文件(目录)
答案2
这将显示哪些用户拥有多个目录:
find /shared -type d -printf '%u\n' | sort | uniq -dc
这需要GNUfind
支持该-printf
行动。你的 CentOS 会有这个。
这将列出具有多个目录的用户及其目录:
find /shared -type d -printf '%u %p\0' | awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
为了获得最大的灵活性,我们使用了 NUL 分隔的输出find
。为此,我们需要 GNU awk 或支持 NUL 分隔输入的最新版本的 mawk。由于您使用的是 CentOS,所以这应该没问题。
怎么运行的
find /shared -type d -printf '%u %p\0'
这告诉 find在 NUL 分隔的列表中查找
/shared
并打印出其所有者%u
以及目录名称。%p
awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"
这会计算每个用户拥有的目录数量,并为拥有多个目录的用户打印一份报告。更详细地说:
c[$1]++
增加第一个输入字段中指定的用户的计数。a[$1]=a[$1](a[$1]?"\n ":"")$0}
保存为此用户找到的每个目录的名称。END{for (user in c) if (c[user]>1) print c[user],a[user]}
打印出报告。RS="\0"
告诉awk
使用 NUL 分隔的输入。即使目录名称包含换行符或其他困难字符,这也使进程安全。