Encontre o dono de um diretório ou arquivo, mas apenas retorne isso e nada mais

55

Estou procurando um comando que retornará o proprietário de um diretório e apenas isso - como um regex analisando o comando ls -lat ou algo semelhante? Eu quero usar o resultado em outro script.

    
por Jason 20.02.2011 / 23:54

4 respostas

86

stat de GNU coreutils pode fazer isso:

stat -c '%U' /path/of/file/or/directory

Infelizmente, há várias versões de 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, provavelmente é melhor usar 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 POSIX:

ls -ld /path/of/file/or/directory | awk '{print $3}'
    
por 21.02.2011 / 00:14
18

Analisar a saída de ls raramente é uma boa ideia , mas obter os primeiros campos é uma exceção, na verdade funciona em todos os unices “tradicionais” (não funciona em plataformas como algumas implementações do Windows que permitem espaços em nomes de usuários).

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

Outra opção é usar o comando stat , mas o problema com stat do shell é que há vários comandos com sintaxe diferente, portanto stat em um script de shell não é suportável (mesmo em instalações do Linux) .

Observe que testar se 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
    
por 21.02.2011 / 00:15
9

Também é possível fazer isso com o GNU find:

find $directoryname -maxdepth 0 -printf '%u\n'

Isso não é portável fora do sistema GNU, mas eu ficaria surpreso em encontrar uma distribuição Linux onde isso não funcione.

    
por 21.02.2011 / 01:17
2

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 quanto usar stat , find ou awk , mas pode funcionar com muita facilidade.

    
por 04.04.2018 / 03:38