Antworten:
stat
von GNU Coreutils können dies tun:
stat -c '%U' /path/of/file/or/directory
Leider gibt es eine Reihe von Versionen von stat
und es gibt nicht viel Konsistenz in ihrer Syntax. Zum Beispiel unter FreeBSD
stat -f '%Su' /path/of/file/or/directory
Wenn es um Portabilität geht, ist es wahrscheinlich besser, Gilles 'Vorschlag zu kombinieren ls
und zu verwenden awk
. Es muss zwei Prozesse anstelle von einem starten, hat jedoch den Vorteil, dass nur die POSIX-Standardfunktionalität verwendet wird:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
(einen Site-weiten Standard) in /usr/local/bin
oder irgendwo im Haus des Benutzers geben) und er ist selten verfügbar auf anderen unices.
stat -c '%U' DIR
gedruckt wird UNKNOWN
, was je nach Ansicht weniger hilfreich oder angemessener ist.
Das Parsen der Ausgabe von ls
ist selten eine gute Idee , aber das Erhalten der ersten Felder ist eine Ausnahme, es funktioniert tatsächlich auf allen "traditionellen" Unices (es funktioniert nicht auf Plattformen wie einigen Windows-Implementierungen, die Leerzeichen in Benutzernamen zulassen).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Eine andere Option ist die Verwendung eines stat
Befehls. Das Problem mit stat
der Shell besteht jedoch darin, dass mehrere Befehle mit unterschiedlicher Syntax vorhanden sind, sodass stat
ein Shell-Skript nicht portierbar ist (auch nicht für Linux-Installationen).
Beachten Sie, dass das Testen, ob ein bestimmter Benutzer der Eigentümer ist, eine andere Angelegenheit ist.
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
Leider gibt es auch einige Vorbehalte bei der Herangehensweise, wie ich hier bemerkt habe . Ich habe noch keine Lösung für das Problem "Zieldatei / Verzeichnis ist ein Symlink mit einem anderen Namen" gefunden, das ich kürzlich in meinem Kommentar erwähnt habe.
find . -user "$username" -print -prune -o -prune
könnten Sie einfach tunfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
anstatt nur awk '{print $3}'
? Ich bin mir nicht sicher, warum das NR==1
hier notwendig ist.
ls
eine neue Zeile in einem Pfad dazu führt, dass die Zeile in zwei Teile geteilt wird (was meiner Meinung nach der Randfall ist, den Sie abdecken möchten)? Auf GNU ls
(neuere Version), BusyBox ls
und FreeBSD ls
ist ein Newline zurückgeführt, wie $'\n'
, ?
und ?
, respectively.
Das kann man auch mit GNU find machen:
find $directoryname -maxdepth 0 -printf '%u\n'
Dies ist außerhalb des GNU-Systems nicht portierbar, aber ich wäre überrascht, eine Linux-Distribution zu finden, bei der es nicht funktioniert.
find
dies nicht der Fall ist -printf
.
-printf
:-(.
In pure bash können Sie die Ausgabe von ls
in ein Array konvertieren und in dieses indexieren.
# (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
Es ist nicht so elegant wie die Verwendung von stat
, find
oder awk
, könnte aber zur Not funktionieren.