我正在寻找一个命令,它将返回一个目录的所有者,而且只有那个——例如解析ls -lat命令的正则表达式或类似的东西?我想在另一个脚本中使用结果。
cjm*_*cjm 117
stat 从GNU coreutils可以做到这一点:
stat -c '%U' /path/of/file/or/directory
Run Code Online (Sandbox Code Playgroud)
不幸的是,有许多版本的stat,并且它们的语法没有很多一致性。例如,在 FreeBSD 上,它将是
stat -f '%Su' /path/of/file/or/directory
Run Code Online (Sandbox Code Playgroud)
如果考虑可移植性,则最好使用Gilles 建议将ls和结合使用awk。它必须启动两个进程而不是一个进程,但它的优点是仅使用 POSIX 标准功能:
ls -ld /path/of/file/or/directory | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 22
解析 的输出ls很少是一个好主意,但获得前几个字段是一个例外,它实际上适用于所有“传统” unices(它不适用于某些平台,例如某些允许用户名中有空格的 Windows 实现)。
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用stat命令,但stat来自 shell的问题在于有多个具有不同语法的命令,因此stat在 shell 脚本中是不可移植的(即使跨 Linux 安装)。
请注意,测试给定用户是否是所有者是一个不同的命题。
if [ -n "$(find . -user "$username" -print -prune -o -prune)" ]; then
echo "The current directory is owned by $username."
fi
if [ -n "$(find . -user "$(id -u)" -print -prune -o -prune)" ]; then
echo "The current directory is owned by the current user."
fi
Run Code Online (Sandbox Code Playgroud)
mat*_*tdm 12
也可以用 GNU 做到这一点find:
find "$directoryname" -maxdepth 0 -printf '%u\n'
Run Code Online (Sandbox Code Playgroud)
这在 GNU 系统之外是不可移植的,但我会惊讶地发现它不能工作的 Linux 发行版。