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 stat
và 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 ls
và 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}'
stat
tiêu chuẩn khác (trên toàn trang web) trong /usr/local/bin
hoặ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' DIR
sẽ 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 ls
hiế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 stat
lệnh, nhưng vấn đề stat
từ shell là có nhiều lệnh với cú pháp khác nhau, do đó, stat
trong 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 | awk
cá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 -prune
bạ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==1
cần thiết ở đây.
ls
mộ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 ls
và FreeBSD, ls
mộ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.
find
không có -printf
.
-printf
Trong bash thuần, bạn có thể chuyển đổi đầu ra của ls
mộ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
, find
hoặc awk
, nhưng có thể làm việc trong một pinch.