Yanıtlar:
stat dan GNU coreutils yapabilirsiniz:
stat -c '%U' /path/of/file/or/directory
Ne yazık ki, bazı sürümleri statvardı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 lsve 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}'
statbir yerinde farklı (site çapında bir standart olabilir) olabilir /usr/local/binve nadiren kullanılabilir. diğer birliklerde.
stat -c '%U' DIRbu kullanıcılara UNKNOWNnası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ı lsnadiren 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 statkomut kullanmaktır , ancak statkabuktan kaynaklanan sorun farklı sözdizimine sahip birden fazla komut bulunmasıdır, bu nedenle statbir 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 -prunesadece yapabilirdifind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'Sadece kullanmak yerine herhangi bir sebep var mı awk '{print $3}'? Neden NR==1burada gerekli olduğundan emin değilim .
lsbir 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 lsve FreeBSD lsbir 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ı lsbir 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, findya awk, ama bir çimdik işe yarayabilir.