it-swarm.cn

查找目录或文件的所有者,但仅返回该目录或文件,仅此而已

我正在寻找一个仅返回目录所有者的命令,例如正则表达式解析ls -lat命令或类似内容?我想在另一个脚本中使用结果。

67
Jason

stat 来自 GNU coreutils 可以做到这一点:

stat -c '%U' /path/of/file/or/directory

不幸的是,stat的版本很多,并且它们的语法没有很多一致性。例如,在FreeBSD上,

stat -f '%Su' /path/of/file/or/directory

如果需要考虑可移植性,则最好使用 吉尔斯的建议 结合使用lsawk。它必须启动两个进程而不是一个进程,但是它具有仅使用POSIX标准功能的优点:

ls -ld /path/of/file/or/directory | awk '{print $3}'
107
cjm

解析ls的输出很少是个好主意 ,但是获取前几个字段是一个例外,它实际上适用于所有“传统”的unices(不适用于平台)例如某些允许用户名中包含空格的Windows实现)。

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

另一种选择是使用stat命令,但是Shell中stat的问题是存在多个具有不同语法的命令,因此Shell脚本中的stat是不可移植的(甚至跨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
20

也可以使用GNU查找:

find $directoryname -maxdepth 0 -printf '%u\n'

这在GNU)系统之外)是不可移植的,但是我很惊讶地发现Linux发行版无法正常工作。

10
mattdm

在纯bash中,您可以将ls的输出转换为数组并对其进行索引。

# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)    
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser

它不像使用statfindawk一样优雅,但可以在某些情况下使用。

2
codehearts