Respostas:
stat do GNU coreutils pode fazer isso:
stat -c '%U' /path/of/file/or/directory
Infelizmente, existem várias versões state não há muita consistência em sua sintaxe. Por exemplo, no FreeBSD, seria
stat -f '%Su' /path/of/file/or/directory
Se a portabilidade é uma preocupação, você provavelmente está melhor usando a sugestão de Gilles de combinar lse awk. Ele precisa iniciar dois processos em vez de um, mas tem a vantagem de usar apenas a funcionalidade padrão do POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(um padrão para todo o site) em /usr/local/binalgum lugar da casa do usuário) e raramente está disponível em outros departamentos.
stat -c '%U' DIRimprimirá UNKNOWN, o que é menos útil ou mais apropriado, dependendo de como você o vê.
Analisar a saída de lsraramente é uma boa ideia , mas obter os primeiros campos é uma exceção, pois na verdade funciona em todos os departamentos "tradicionais" (não funciona em plataformas como algumas implementações do Windows que permitem espaços nos nomes de usuário).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Outra opção é usar um statcomando, mas o problema com stato shell é que existem vários comandos com sintaxe diferente; portanto, statem um shell, o script não é portável (mesmo em instalações Linux).
Observe que testar se um determinado usuário é o proprietário é uma proposta diferente.
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 | awkInfelizmente, existem algumas ressalvas na abordagem, como observei aqui . Ainda não encontrei uma solução para o problema "arquivo / diretório de destino é um link simbólico com um nome diferente", que mencionei em meu comentário recente.
find . -user "$username" -print -prune -o -prunevocê só poderia fazerfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'vez de apenas awk '{print $3}'? Não sei por que NR==1é necessário aqui.
lsonde uma nova linha em um caminho faz com que a linha seja dividida em duas (que eu acredito que seja o caso extremo que você está tentando cobrir)? No GNU ls(versão nova), BusyBox lse FreeBSD, lsuma nova linha é retornada como $'\n', ?e ?, respectivamente.
Também é possível fazer isso com o GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Isso não é portátil fora do sistema GNU, mas ficaria surpreso ao encontrar uma distribuição Linux onde não funcione.
findque não possui -printf.
-printf:-(.
No bash puro, você pode converter a saída de lsem uma matriz e indexá-la.
# (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
Não é tão elegante como a utilização stat, findou awk, mas poderia trabalhar em uma pitada.