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 ls
et 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/bin
ou quelque part dans la maison de l’utilisateur), et est rarement disponible sur d'autres unices.
stat -c '%U' DIR
imprimera UNKNOWN
, ce qui est moins utile ou plus approprié, selon votre apparence.
L’analyse de la sortie de ls
est 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 stat
commande, mais le problème posé par stat
le shell réside dans le fait qu'il existe plusieurs commandes avec une syntaxe différente, de sorte stat
qu'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 | awk
Malheureusement, 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 -prune
vous 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==1
c'est nécessaire ici.
ls
laquelle 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 ls
et FreeBSD, ls
une 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.
find
n’a pas -printf
.
-printf
:-(.
En bash pur, vous pouvez convertir la sortie de ls
en 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
, find
ou awk
, mais pourrait travailler dans un pincement.