web-dev-qa-db-fra.com

Trouvez le propriétaire d'un répertoire ou d'un fichier, mais renvoyez-le uniquement et rien d'autre

Je recherche une commande qui retournera le propriétaire d'un répertoire et seulement cela - comme une expression rationnelle analysant le ls -lat commande ou quelque chose de similaire? Je veux utiliser le résultat dans un autre script.

67
Jason

stat from GNU coreutils peut faire ceci:

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

Malheureusement, il existe un certain nombre de versions de stat, et il n'y a pas beaucoup de cohérence dans leur syntaxe. Par exemple, sur FreeBSD, ce serait

stat -f '%Su' /path/of/file/or/directory

Si la portabilité est un problème, vous feriez probablement mieux d'utiliser suggestion de Gilles de combiner ls et awk. Il doit démarrer deux processus au lieu d'un, mais il a l'avantage d'utiliser uniquement des fonctionnalités standard POSIX:

ls -ld /path/of/file/or/directory | awk '{print $3}'
107
cjm

L'analyse de la sortie de ls est rarement une bonne idée , mais l'obtention des premiers champs est une exception, cela fonctionne en fait sur tous les unités "traditionnelles" (cela ne fonctionne pas sur les plates-formes comme certaines implémentations Windows qui autorisent les espaces dans les noms d’utilisateur).

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

Une autre option consiste à utiliser une commande stat, mais le problème avec stat à partir du Shell est qu'il existe plusieurs commandes avec une syntaxe différente, donc stat dans un script Shell n'est pas transférable (même sur les installations Linux).

Notez que tester si un utilisateur donné est le propriétaire est une proposition différente.

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

On peut aussi le faire avec GNU find:

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

Ce n'est pas portable en dehors du système GNU, mais je serais surpris de trouver une distribution Linux où cela ne fonctionne pas.

10
mattdm

En pure bash, vous pouvez convertir la sortie de ls en un tableau et y indexer.

# (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

Ce n'est pas aussi élégant que d'utiliser stat, find ou awk, mais pourrait fonctionner à la rigueur.

2
codehearts