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.
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}'
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.
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.