Yanıtlar:
stat
dan GNU coreutils yapabilirsiniz:
stat -c '%U' /path/of/file/or/directory
Ne yazık ki, bazı sürümleri stat
vardır ve bunların sözdizimlerinde çok fazla tutarlılık yoktur. Örneğin, FreeBSD’de
stat -f '%Su' /path/of/file/or/directory
Taşınabilirliği bir husustur, kullanmakta muhtemelen daha çok işinize Gilles önerisini birleştirerek ls
ve awk
. Biri yerine iki işlemi başlatması gerekir, ancak yalnızca POSIX standardı işlevsellik kullanma avantajına sahiptir:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
bir yerinde farklı (site çapında bir standart olabilir) olabilir /usr/local/bin
ve nadiren kullanılabilir. diğer birliklerde.
stat -c '%U' DIR
bu kullanıcılara UNKNOWN
nasıl baktığınıza bağlı olarak daha az yardımcı veya daha uygun olanı yazdırır .
Çıktısının ayrıştırılması ls
nadiren iyi bir fikirdir , ancak ilk birkaç alanı elde etmek bir istisnadır, aslında tüm “geleneksel” birimlerde çalışır (kullanıcı adlarında boşluk sağlayan bazı Windows uygulamaları gibi platformlarda çalışmaz).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Başka bir seçenek bir stat
komut kullanmaktır , ancak stat
kabuktan kaynaklanan sorun farklı sözdizimine sahip birden fazla komut bulunmasıdır, bu nedenle stat
bir kabuk komut dosyasında (Linux kurulumlarında bile) desteklenemez.
Belirli bir kullanıcının sahibi olup olmadığının test edilmesinin farklı bir teklif olduğunu unutmayın.
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
gibi, ne yazık ki yaklaşımı ile bazı uyarılar vardır . Son yorumumda bahsettiğim "hedef dosya / dir farklı bir isme sahip bir sembolik bağlantı" sorunu için henüz bir çözüm bulamadım.
find . -user "$username" -print -prune -o -prune
sadece yapabilirdifind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
Sadece kullanmak yerine herhangi bir sebep var mı awk '{print $3}'
? Neden NR==1
burada gerekli olduğundan emin değilim .
ls
bir yoldaki bir yeni çizginin, çizginin ikiye bölünmesine neden olduğu bir uygulamanın farkında mısınız? GNU ls
(newish versiyonu), BusyBox ls
ve FreeBSD ls
bir satır olarak döndürülür $'\n'
, ?
ve ?
sırasıyla.
Bir de GNU bulmak ile bunu yapabilirsiniz:
find $directoryname -maxdepth 0 -printf '%u\n'
Bu GNU sisteminin dışında taşınabilir değil, ancak çalışmadığı bir Linux dağıtımı bulduğumda şaşırdım.
-printf
Saf bash'te çıktısını ls
bir diziye ve dizine dönüştürebilirsiniz.
# (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
Bu kullanmak kadar zarif değil stat
, find
ya awk
, ama bir çimdik işe yarayabilir.