Answers:
stat
从GNU coreutils可以做到这一点:
stat -c '%U' /path/of/file/or/directory
不幸的是,有许多版本stat
,并且它们的语法没有很多一致性。例如,在FreeBSD上,
stat -f '%Su' /path/of/file/or/directory
如果需要考虑可移植性,那么最好使用Gilles提出的合并ls
和的建议awk
。它必须启动两个进程而不是一个进程,但是它具有仅使用POSIX标准功能的优点:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
中/usr/local/bin
或某处可能存在其他(站点范围的标准)),并且很少有在其他联合国上。
stat -c '%U' DIR
将打印UNKNOWN
,这是帮助较小或较为合适,这取决于你如何看待它。
解析输出ls
很少是一个好主意,但是获取前几个字段是一个例外,它实际上适用于所有“传统”的unices(不适用于某些平台,例如某些Windows实现中允许在用户名中留有空格)。
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
另一个选择是使用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
find . -user "$username" -print -prune -o -prune
您只能这样做find . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
而不是仅仅使用awk '{print $3}'
?我不确定为什么在NR==1
这里有必要。
ls
某个路径中的换行符导致该行拆分为两行的实现(我认为这是您要覆盖的边缘情况)?上GNU ls
(新望版),BusyBox的ls
和FreeBSD ls
换行符返回为$'\n'
,?
和?
分别。
一个人也可以用GNU查找来做到这一点:
find $directoryname -maxdepth 0 -printf '%u\n'
这不能移植到GNU系统之外,但是我惊讶地发现Linux发行版无法正常工作。
-printf
: