我正在寻找一种在 bash 脚本中返回文件所有者的方法。我猜想使用“gawk”是可能的,但老实说我没有任何线索,而且网上似乎还没有发布一个可以理解的答案。
答案1
用于stat
此。
在 GNU 系统中:
要获取所有者的用户名:
stat -c '%U' file.txt
要获取所有者的用户 ID (UID):
stat -c '%u' file.txt
假设文件是file.txt
.
适用于 FreeBSD 和 Mac OS X(感谢@cas):
对于用户名:
stat -f '%Su' file.txt
对于 UID:
stat -f '%u' file.txt
答案2
ls -l foo
字段 #3 是所有者,字段 #4 是组。因此:
set -- $(ls -l foo) ; echo $3
但统计数据如果可用的话会更好。
答案3
请注意,zsh
shell 在模块中有自己的stat
内置命令(并且早在 GNU 和 BSD 添加它们自己的命令之前就已经有了)zsh/stat
:
zmodload zsh/stat
stat +uid file
将输出符号链接解析后的所有者 uid file
。如果对于符号链接,您希望最终解析为符号链接的所有者而不是文件,请添加该-L
选项(也是stat
alstat()
而不是 a stat()
)。
添加将-s
其翻译uid
为用户名的选项。如果有多个具有相应 uid 的用户名,则会报告getpwuid()
.如果该 uid 没有用户名,则该 uid 将保持未翻译状态。
早在 GNU coreutils 添加stat
命令之前,GNUfind
就有能力通过其-printf
谓词来实现这一点:
find file -prune -printf '%U\n'
替换%U
为%u
将 uid 转换为一个匹配的用户名。添加-H
选项以跟踪符号链接并获取最终目标的所有者。
POSIXly,你需要依赖ls
:
LC_ALL=C ls -nd file | LC_ALL=C awk '{print $3; exit}'
替换-n
为-l
将 uid 转换为一个用户名(假设用户名不包含空格或制表符)。添加-L
跟随符号链接的选项。