Odpowiedzi:
stat
z GNU coreutils może to zrobić:
stat -c '%U' /path/of/file/or/directory
Niestety istnieje wiele wersji stat
i 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 ls
i 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/bin
domu użytkownika lub gdzieś) i jest rzadko dostępny na innych jednorożcach.
stat -c '%U' DIR
wydrukuje UNKNOWN
, co jest mniej pomocne lub bardziej odpowiednie, w zależności od tego, jak na to patrzysz.
Parsowanie danych wyjściowych ls
rzadko 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 stat
polecenia, ale problem z stat
powłoką polega na tym, że istnieje wiele poleceń o różnej składni, więc stat
w 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 | awk
Niestety, 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 -prune
możesz po prostu zrobićfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
zamiast tylko awk '{print $3}'
? Nie jestem pewien, dlaczego NR==1
jest to konieczne tutaj.
ls
gdzie 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 ls
i FreeBSD ls
nowej 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 ls
na 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
, find
albo awk
, ale może pracować w kropce.