Jawaban:
stat
dari GNU coreutils dapat melakukan ini:
stat -c '%U' /path/of/file/or/directory
Sayangnya, ada beberapa versi stat
, dan tidak ada banyak konsistensi dalam sintaksis mereka. 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
. Itu harus memulai dua proses, bukan satu, tetapi memiliki keuntungan menggunakan hanya fungsi standar POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
(standar situs-lebar) di /usr/local/bin
atau di suatu tempat di rumah pengguna), dan jarang tersedia di unix lain.
stat -c '%U' DIR
akan mencetak UNKNOWN
, yang kurang bermanfaat atau lebih tepat, tergantung pada bagaimana Anda melihatnya.
Mem-parsing output ls
jarang merupakan ide yang bagus , tetapi mendapatkan beberapa bidang pertama adalah pengecualian, itu benar-benar berfungsi 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}'
Pilihan lain adalah dengan menggunakan stat
perintah, tetapi masalah stat
dari shell adalah bahwa ada beberapa perintah dengan sintaks yang berbeda, sehingga 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
ls | awk
Sayangnya, ada beberapa peringatan dengan pendekatannya, seperti yang telah saya catat di sini . Saya belum datang dengan solusi untuk, "file target / dir adalah symlink dengan nama yang berbeda," masalah yang saya sebutkan dalam komentar terakhir saya.
find . -user "$username" -print -prune -o -prune
Anda bisa melakukannyafind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
bukan hanya awk '{print $3}'
? Saya tidak yakin mengapa NR==1
ini perlu di sini.
ls
mana baris baru di jalur menyebabkan garis terpecah menjadi dua (yang saya percaya adalah tepi kasus yang Anda coba tutupi)? Pada GNU ls
(versi agak baru), BusyBox ls
dan FreeBSD ls
baris baru dikembalikan sebagai $'\n'
, ?
dan ?
masing-masing.
Anda juga dapat melakukan ini dengan GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Ini bukan portable di luar sistem GNU, tetapi saya akan terkejut menemukan distribusi Linux yang tidak berfungsi.
find
tidak memilikinya -printf
.
-printf
:-(.
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 elegan seperti menggunakan stat
, find
atau awk
, tetapi bisa bekerja dalam keadaan darurat.