Respostas:
stat
do GNU coreutils pode fazer isso:
stat -c '%U' /path/of/file/or/directory
Infelizmente, existem várias versões stat
e 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 ls
e 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/bin
algum lugar da casa do usuário) e raramente está disponível em outros departamentos.
stat -c '%U' DIR
imprimirá UNKNOWN
, o que é menos útil ou mais apropriado, dependendo de como você o vê.
Analisar a saída de ls
raramente é 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 stat
comando, mas o problema com stat
o shell é que existem vários comandos com sintaxe diferente; portanto, stat
em 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 | awk
Infelizmente, 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 -prune
você 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.
ls
onde 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 ls
e FreeBSD, ls
uma 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.
find
que não possui -printf
.
-printf
:-(.
No bash puro, você pode converter a saída de ls
em 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
, find
ou awk
, mas poderia trabalhar em uma pitada.