Câu trả lời:
stat từ lõi core GNU có thể làm điều này:
stat -c '%U' /path/of/file/or/directory
Thật không may, có một số phiên bản statvà không có nhiều tính nhất quán trong cú pháp của chúng. Ví dụ, trên FreeBSD, nó sẽ là
stat -f '%Su' /path/of/file/or/directory
Nếu tính di động là một mối quan tâm, có lẽ bạn nên sử dụng đề xuất kết hợp lsvà awk. Nó phải bắt đầu hai quy trình thay vì một, nhưng nó có lợi thế là chỉ sử dụng chức năng tiêu chuẩn POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stattiêu chuẩn khác (trên toàn trang web) trong /usr/local/binhoặc ở đâu đó trong nhà của người dùng) và hiếm khi có sẵn trên các đơn vị khác.
stat -c '%U' DIRsẽ in UNKNOWN, điều này ít hữu ích hơn hoặc phù hợp hơn, tùy thuộc vào cách bạn nhìn vào nó.
Phân tích cú pháp đầu ra lshiếm khi là một ý tưởng hay , nhưng có được một vài trường đầu tiên là một ngoại lệ, nó thực sự hoạt động trên tất cả các thông báo truyền thống của truyền thống (nó không hoạt động trên các nền tảng như một số triển khai Windows cho phép khoảng trắng trong tên người dùng).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Một tùy chọn khác là sử dụng một statlệnh, nhưng vấn đề stattừ shell là có nhiều lệnh với cú pháp khác nhau, do đó, stattrong một kịch bản shell là không thể truy cập được (thậm chí trên các cài đặt Linux).
Lưu ý rằng kiểm tra xem một người dùng nhất định có phải là chủ sở hữu hay không là một đề xuất khác nhau.
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 | awkcách tiếp cận quá tiếc, như tôi đã lưu ý ở đây . Tôi chưa đưa ra giải pháp cho "tệp mục tiêu / thư mục đích là một liên kết tượng trưng với một tên khác", vấn đề tôi đã đề cập trong bình luận gần đây.
find . -user "$username" -print -prune -o -prunebạn chỉ có thể làmfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'thay vì chỉ awk '{print $3}'? Tôi không chắc tại sao lại NR==1cần thiết ở đây.
lsmột dòng mới trong một đường dẫn làm cho dòng bị chia làm hai (mà tôi tin là trường hợp cạnh bạn đang cố gắng che)? Trên GNU ls(phiên bản mới), BusyBox lsvà FreeBSD, lsmột dòng mới được trả lại lần lượt là $'\n', ?và ?, tương ứng.
Người ta cũng có thể làm điều này với GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Đây không phải là di động bên ngoài hệ thống GNU, nhưng tôi rất ngạc nhiên khi tìm thấy một bản phân phối Linux nơi nó không hoạt động.
findkhông có -printf.
-printf
Trong bash thuần, bạn có thể chuyển đổi đầu ra của lsmột mảng và lập chỉ mục vào nó.
# (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
Nó không phải là thanh lịch như sử dụng stat, findhoặc awk, nhưng có thể làm việc trong một pinch.