Ответы:
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
, но может работать в крайнем случае.