it-swarm-tr.com

Bir dizinin veya dosyanın sahibini bulun, ancak yalnızca bunu döndürün ve başka bir şey döndürmeyin

ls -lat Komutunu veya benzer bir şeyi ayrıştırma gibi bir regex gibi - bir dizinin sahibi ve sadece bu döndürecek bir komut arıyorum? Sonucu başka bir komut dosyasında kullanmak istiyorum.

67
Jason

stat from GNU coreutils bunu yapabilir:

stat -c '%U' /path/of/file/or/directory

Ne yazık ki, bir dizi stat sürümü var ve sözdizimlerinde çok fazla tutarlılık yok. Örneğin, FreeBSD'de,

stat -f '%Su' /path/of/file/or/directory

Taşınabilirlik bir endişe kaynağıysa, muhtemelen ls ve awk öğelerini birleştirmek için Gilles'in önerisi kullanmanız daha iyi olur. Bir yerine iki işlem başlatması gerekir, ancak yalnızca POSIX standart işlevlerini kullanma avantajına sahiptir:

ls -ld /path/of/file/or/directory | awk '{print $3}'
107
cjm

ls çıktısını ayrıştırmak nadiren iyi bir fikirdir , ancak ilk birkaç alanı elde etmek bir istisna, aslında tüm “geleneksel” birimlerde çalışıyor (platformlarda çalışmıyor) kullanıcı adlarında boşluklara izin veren bazı Windows uygulamaları gibi).

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

Başka bir seçenek de stat komutu kullanmaktır, ancak Kabuktan stat ile ilgili sorun, farklı sözdizimine sahip birden çok komutun bulunmasıdır, bu nedenle Shell betiğinde stat kaydedilemez (Linux kurulumlarında bile).

Belirli bir kullanıcının sahip olup olmadığını test etmenin 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

Bunu GNU find:

find $directoryname -maxdepth 0 -printf '%u\n'

Bu, GNU sistemi dışında taşınabilir değildir, ancak çalışmadığı bir Linux dağıtımı bulmak beni şaşırttı.

10
mattdm

Saf bash'da ls çıktısını 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

stat, find veya awk kullanmak kadar zarif değil, ama bir tutam içinde çalışabilir.

2
codehearts