Odpowiedzi:
stat z GNU coreutils może to zrobić:
stat -c '%U' /path/of/file/or/directory
Niestety istnieje wiele wersji stati ich składnia nie jest zbyt spójna. Na przykład na FreeBSD
stat -f '%Su' /path/of/file/or/directory
Jeśli problemem jest przenośność, prawdopodobnie lepiej skorzystasz z sugestii Gillesa dotyczącej połączenia lsi awk. Musi uruchomić dwa procesy zamiast jednego, ale ma tę zaletę, że używa tylko funkcjonalności zgodnej ze standardem POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(standard dla całej witryny) w /usr/local/bindomu użytkownika lub gdzieś) i jest rzadko dostępny na innych jednorożcach.
stat -c '%U' DIRwydrukuje UNKNOWN, co jest mniej pomocne lub bardziej odpowiednie, w zależności od tego, jak na to patrzysz.
Parsowanie danych wyjściowych lsrzadko jest dobrym pomysłem , ale uzyskanie pierwszych kilku pól jest wyjątkiem, w rzeczywistości działa na wszystkich „tradycyjnych” unikach (nie działa na platformach takich jak niektóre implementacje Windows, które dopuszczają spacje w nazwach użytkowników).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Inną opcją jest użycie statpolecenia, ale problem z statpowłoką polega na tym, że istnieje wiele poleceń o różnej składni, więc statw skrypcie powłoki nie można importować (nawet w różnych instalacjach Linuksa).
Pamiętaj, że sprawdzenie, czy dany użytkownik jest właścicielem, jest inną propozycją.
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 | awkNiestety, istnieje pewne zastrzeżenie dotyczące tego podejścia, jak zauważyłem tutaj . Nie znalazłem jeszcze rozwiązania dla problemu: „plik docelowy / katalog to dowiązanie symboliczne o innej nazwie”, o którym wspomniałem w moim ostatnim komentarzu.
find . -user "$username" -print -prune -o -prunemożesz po prostu zrobićfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'zamiast tylko awk '{print $3}'? Nie jestem pewien, dlaczego NR==1jest to konieczne tutaj.
lsgdzie nowa linia na ścieżce powoduje podział linii na dwie części (co moim zdaniem jest przypadkiem krawędzi, który próbujesz pokryć)? Na GNU ls(wersja nowymi), BusyBox lsi FreeBSD lsnowej linii jest zwracany jako $'\n', ?i ?, odpowiednio.
Można to również zrobić za pomocą GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Nie jest to przenośne poza systemem GNU, ale zdziwiłbym się, gdy znalazł dystrybucję Linuksa, w której nie działa.
-printf:-(.
W czystym bashu możesz przekonwertować dane wyjściowe lsna tablicę i indeksować do niej.
# (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
To nie jest tak elegancki jak używanie stat, findalbo awk, ale może pracować w kropce.