Szukam polecenia, które zwróci właściciela katalogu i tylko to - takie jak wyrażenie regularne analizujące ls -lat
polecenie lub coś podobnego? Chcę użyć wyniku w innym skrypcie.
shell-script
ls
Jason
źródło
źródło
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
ma tę zaletę, że współpracuje również z BusyBox , jeślistat
polecenie jest wkompilowane.stat -c '%U' DIR
wydrukujeUNKNOWN
, 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).Inną opcją jest użycie
stat
polecenia, ale problem zstat
powłoką polega na tym, że istnieje wiele poleceń o różnej składni, więcstat
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ą.
źródło
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 tylkoawk '{print $3}'
? Nie jestem pewien, dlaczegoNR==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 GNUls
(wersja nowymi), BusyBoxls
i FreeBSDls
nowej linii jest zwracany jako$'\n'
,?
i?
, odpowiednio.Można to również zrobić za pomocą GNU find:
Nie jest to przenośne poza systemem GNU, ale zdziwiłbym się, gdy znalazł dystrybucję Linuksa, w której nie działa.
źródło
find
nie ma-printf
.-printf
:-(.W czystym bashu możesz przekonwertować dane wyjściowe
ls
na tablicę i indeksować do niej.To nie jest tak elegancki jak używanie
stat
,find
alboawk
, ale może pracować w kropce.źródło