it-swarm-vi.com

Tìm chủ sở hữu của một thư mục hoặc tệp, nhưng chỉ trả lại và không có gì khác

Tôi đang tìm kiếm một lệnh sẽ trả về chủ sở hữu của một thư mục và chỉ có điều đó - chẳng hạn như một regex phân tích cú pháp ls -lat lệnh hoặc một cái gì đó tương tự? Tôi muốn sử dụng kết quả trong một kịch bản khác.

67
Jason

stat từ GNU coreutils 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 của 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 gợi ý của Gilles khi kết hợp lsawk. 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}'
107
cjm

Phân tích cú pháp đầu ra của ls hiếm khi là một ý tưởng hay , nhưng việc 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 YouTube (nó không hoạt động trên nền tảng chẳng hạn 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 lệnh stat, nhưng vấn đề với stat từ Shell là có nhiều lệnh với cú pháp khác nhau, vì vậy stat trong tập lệnh Shell 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

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.

10
mattdm

Trong bash thuần, bạn có thể chuyển đổi đầu ra của ls thành 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 thanh lịch bằng việc sử dụng stat, find hoặc awk, nhưng có thể hoạt động trong một nhúm.

2
codehearts