查找用户拥有的文件夹

查找用户拥有的文件夹

我有几个共享文件夹,我需要查找用户是否在那里有几个文件夹。例如:

/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 分隔的输入。即使目录名称包含换行符或其他困难字符,这也使进程安全。

相关内容