我确信这很容易但我找不到它。
我正在编写一个 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_file
,file_new
和file
可能会全部出现。) - 最后,将目标文件的单个 ls -l 行传递给 awk,并抓取第 3(或第 4)个空格分隔的项目作为用户(或组)名称。
请注意,此实现在相对目录方面存在问题。(例如,不要尝试在何处运行它TARGET_FILE=../
。)我确信可以使用 来进一步强化它realpath
,但这在 OS X 上不可用,因此如果我们使用它,我们又回到了特定于平台的工具。