Réponses:
stat de GNU coreutils peuvent le faire:
stat -c '%U' /path/of/file/or/directory
Malheureusement, il existe plusieurs versions de stat, et leur syntaxe n’est pas très cohérente. Par exemple, sur FreeBSD, ce serait
stat -f '%Su' /path/of/file/or/directory
Si la portabilité est une préoccupation, vous feriez probablement mieux d'utiliser la suggestion de Gilles de combiner lset awk. Il doit démarrer deux processus au lieu d'un, mais il présente l'avantage d'utiliser uniquement les fonctionnalités standard POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(un standard du site) dans /usr/local/binou quelque part dans la maison de l’utilisateur), et est rarement disponible sur d'autres unices.
stat -c '%U' DIRimprimera UNKNOWN, ce qui est moins utile ou plus approprié, selon votre apparence.
L’analyse de la sortie de lsest rarement une bonne idée , mais l’obtention des premiers champs est une exception, elle fonctionne en fait sur tous les unices «traditionnels» (elle ne fonctionne pas sur des plates-formes telles que certaines implémentations Windows qui autorisent des espaces dans les noms d’utilisateur).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Une autre option consiste à utiliser une statcommande, mais le problème posé par statle shell réside dans le fait qu'il existe plusieurs commandes avec une syntaxe différente, de sorte statqu'un script de shell est non exportable (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
ls | awkMalheureusement, comme je l’ai déjà noté ici, il y a certaines mises en garde concernant cette approche . Je n'ai pas encore trouvé de solution pour le problème "le fichier / répertoire cible est un lien symbolique portant un nom différent", problème que j'ai mentionné dans mon récent commentaire.
find . -user "$username" -print -prune -o -prunevous pourriez simplement le fairefind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'au lieu de juste awk '{print $3}'? Je ne sais pas pourquoi NR==1c'est nécessaire ici.
lslaquelle une nouvelle ligne dans un chemin provoque la scission de la ligne en deux (ce qui, je crois, est le cas extrême que vous essayez de couvrir)? Sous GNU ls(version nouvelle), BusyBox lset FreeBSD, lsune nouvelle ligne est renvoyée sous la forme $'\n', ?et ?.
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.
findn’a pas -printf.
-printf:-(.
En bash pur, vous pouvez convertir la sortie de lsen un tableau et l’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
Il est pas aussi élégant que l' utilisation stat, findou awk, mais pourrait travailler dans un pincement.