查找目录或文件的所有者,但只返回该所有者而不返回其他任何内容

Jas*_*son 75 ls shell-script

我正在寻找一个命令,它将返回一个目录的所有者,而且只有那个——例如解析ls -lat命令的正则表达式或类似的东西?我想在另一个脚本中使用结果。

cjm*_*cjm 117

statGNU 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)

  • stat -c %U /path,如果简洁是一个奖励。 (2认同)

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 发行版。