Ответы:
stat из GNU coreutils может сделать это:
stat -c '%U' /path/of/file/or/directory
К сожалению, существует несколько версий stat, и в их синтаксисе нет большой последовательности. Например, во FreeBSD это было бы
stat -f '%Su' /path/of/file/or/directory
Если переносимость является проблемой, вам, вероятно, лучше воспользоваться предложением Жиля о комбинировании lsи awk. Он должен запускать два процесса вместо одного, но он имеет преимущество в использовании только стандартных функций POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
statдля всего сайта) в /usr/local/binдоме пользователя или где-то в нем), и он редко доступен на других отделениях.
stat -c '%U' DIRнапечатает UNKNOWN, что менее полезно или более уместно, в зависимости от того, как вы на это смотрите.
Анализ выходных данных lsредко является хорошей идеей , но получение первых нескольких полей является исключением, оно фактически работает на всех «традиционных» единицах (оно не работает на платформах, таких как некоторые реализации Windows, которые допускают пробелы в именах пользователей).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Другой вариант - использовать statкоманду, но проблема с statоболочкой заключается в том, что существует несколько команд с разным синтаксисом, поэтому 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
ls | awkсожалению, есть некоторые предостережения с подходом, как я уже отмечал здесь . Я еще не нашел решение проблемы "target file / dir - это символическая ссылка с другим именем", о которой я упоминал в своем недавнем комментарии.
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:
find $directoryname -maxdepth 0 -printf '%u\n'
Это не переносимо за пределы системы GNU, но я был бы удивлен, обнаружив дистрибутив Linux, где он не работает.
findнет -printf.
-printf:-(.
В чистом 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
Это не так элегантно, как использование stat, findили awk, но может работать в крайнем случае.