Bash:查找目录组所有者

Bash:查找目录组所有者

我确信这很容易但我找不到它。

我正在编写一个 bash 脚本,我想将一个已知用户添加到一个组中。组名由目录决定,目录作为变量发送到该 bash 脚本。

所以:

DIR="whatever"
GROUP=DIR groupname 
usermod -a -G $GROUP userx

答案1

stat -c %g <file>(Linux)

stat -f %g <file>(BSD)

将返回给定的组 ID<file>

编辑:

stat -c %G <file>(Linux)

stat -f %Sg <file>(BSD)

将返回组名称。

答案2

不可否认,这是更加复杂的,但具有更加跨平台友好的好处:

用户:

\ls -l "$(dirname $TARGET_FILE)" | grep -v '^l' | grep " $(basename $TARGET_FILE)\$" | awk '{ print $3 }'

团体:

\ls -l "$(dirname $TARGET_FILE)" | grep -v '^l' | grep " $(basename $TARGET_FILE)\$" | awk '{ print $4 }'

具体来说:

  • 使用\ls。反斜杠可避免使用任何可能设置默认选项的 shell 别名,例如-F
  • 构建 的-l父目录的 ong 格式列表$TARGET_FILE
  • grep -v '^l'$TARGET_FILE删除列表中可能指向的任何符号链接并传递其余部分。
  • 接下来将结果缩小到以 为基名结尾的 ls 中的一行$TARGET_FILE。前导' '(空格)和尾随\$对于匹配整个基名很重要。(否则old_filefile_newfile可能会全部出现。)
  • 最后,将目标文件的单个 ls -l 行传递给 awk,并抓取第 3(或第 4)个空格分隔的项目作为用户(或组)名称。

请注意,此实现在相对目录方面存在问题。(例如,不要尝试在何处运行它TARGET_FILE=../。)我确信可以使用 来进一步强化它realpath,但这在 OS X 上不可用,因此如果我们使用它,我们又回到了特定于平台的工具。

相关内容