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.
shell-script
ls
Jason
sumber
sumber
stat
(standar situs-lebar) di/usr/local/bin
atau di suatu tempat di rumah pengguna), dan jarang tersedia di unix lain.stat -c %U
memiliki keuntungan juga bekerja dengan BusyBox , jikastat
perintah dikompilasi.stat -c '%U' DIR
akan mencetakUNKNOWN
, 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).Pilihan lain adalah dengan menggunakan
stat
perintah, tetapi masalahstat
dari shell adalah bahwa ada beberapa perintah dengan sintaks yang berbeda, sehinggastat
dalam skrip shell tidak dapat diport (bahkan di seluruh instalasi Linux).Perhatikan bahwa pengujian apakah pengguna yang diberikan adalah pemilik adalah proposisi yang berbeda.
sumber
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 hanyaawk '{print $3}'
? Saya tidak yakin mengapaNR==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 GNUls
(versi agak baru), BusyBoxls
dan FreeBSDls
baris baru dikembalikan sebagai$'\n'
,?
dan?
masing-masing.Anda juga dapat melakukan ini dengan GNU find:
Ini bukan portable di luar sistem GNU, tetapi saya akan terkejut menemukan distribusi Linux yang tidak berfungsi.
sumber
find
tidak memilikinya-printf
.-printf
:-(.Dalam bash murni Anda dapat mengkonversi output
ls
ke array dan indeks ke dalamnya.Ini tidak elegan seperti menggunakan
stat
,find
atauawk
, tetapi bisa bekerja dalam keadaan darurat.sumber