it-swarm-id.com

Temukan pemilik direktori atau file, tetapi hanya kembalikan itu dan tidak ada yang lain

Saya mencari perintah yang akan mengembalikan pemilik direktori dan hanya itu - seperti regex parsing ls -lat perintah atau yang serupa? Saya ingin menggunakan hasilnya di skrip lain.

67
Jason

stat from GNU coreutils dapat melakukan ini:

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

Sayangnya, ada sejumlah versi stat, dan tidak ada banyak konsistensi dalam sintaksisnya. Sebagai contoh, pada FreeBSD, itu akan menjadi

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

Jika portabilitas menjadi perhatian, Anda mungkin lebih baik menggunakan saran Gilles untuk menggabungkan ls dan awk. Ia harus memulai dua proses alih-alih satu, tetapi ia memiliki keuntungan dengan hanya menggunakan fungsionalitas standar-POSIX:

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

Mem-parsing output ls jarang merupakan ide yang bagus , tetapi mendapatkan beberapa field pertama adalah pengecualian, ia benar-benar bekerja pada semua "tradisional" (tidak bekerja pada platform seperti beberapa implementasi Windows yang memungkinkan spasi dalam nama pengguna).

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

Opsi lain adalah dengan menggunakan perintah stat, tetapi masalah dengan stat dari Shell adalah bahwa ada beberapa perintah dengan sintaks yang berbeda, jadi stat dalam skrip Shell tidak dapat diport (bahkan di seluruh instalasi Linux).

Perhatikan bahwa pengujian apakah pengguna yang diberikan adalah pemilik adalah proposisi yang berbeda.

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

Anda juga dapat melakukan ini dengan GNU find:

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

Ini bukan portable di luar sistem GNU, tapi saya akan terkejut menemukan distribusi Linux di mana ia tidak bekerja.

10
mattdm

Dalam bash murni Anda dapat mengkonversi output ls ke array dan indeks ke dalamnya.

# (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

Ini tidak seanggun menggunakan stat, find, atau awk, tetapi dapat bekerja dalam keadaan darurat.

2
codehearts