Làm thế nào để có được danh sách tất cả chủ sở hữu các tệp trong một thư mục


14

Tôi hiện đang cố gắng sửa chữa hệ thống hạn ngạch của mình. Vấn đề của tôi là tôi không thể xác định xem tất cả các tệp trong một thư mục có thuộc sở hữu của cùng một người dùng hay không. Nếu có thể, có một cách để liệt kê các chủ sở hữu khác nhau của các tệp trong một thư mục (đệ quy).

ví dụ get-owners-of DIRNAME


1
Vì vậy, bạn có muốn liệt kê tất cả các chủ sở hữu hoặc tất cả các tệp với chủ sở hữu của họ hoặc tất cả các tệp thuộc sở hữu của bất kỳ ai khác ngoài một người dùng cụ thể không?
Chỉ huy Byte

Câu trả lời:


25

Bạn có thể sử dụng findđể in người dùng (chủ sở hữu) và nhóm và sau đó trích xuất các kết hợp uniq, vd

$ sudo find /var -printf '%u:%g\n' | sort -t: -u
_apt:root
avahi-autoipd:avahi-autoipd
clamav:adm
clamav:clamav
colord:colord
daemon:daemon
lightdm:lightdm
lp:lp
man:root
root:adm
root:crontab
root:lp
root:mail
root:mlocate
root:root
root:shadow
root:staff
root:syslog
root:utmp
root:whoopsie
speech-dispatcher:root
statd:nogroup
steeldriver:crontab
steeldriver:lightdm
steeldriver:steeldriver
syslog:adm
systemd-timesync:systemd-timesync
testuser:crontab

1
Để chỉ đánh giá nội dung thư mục (và không phải thư mục gốc / -ies của chính tìm kiếm) thêm -mindepth 1trước đó -printf. Và tôi sẽ không bao gồm sudotrong ví dụ khi OP dường như không hoạt động trong bối cảnh yêu cầu.
David Foerster

Liệu có -t:làm nên sự khác biệt trong bối cảnh này?
kasperd

@kasperd điểm tốt - có thể là không (nó có thể ảnh hưởng đến thứ tự sắp xếp - nhưng chúng tôi không thực sự quan tâm đến điều đó)
Steeldo

19
stat -c %U * 

sẽ liệt kê chủ sở hữu của tất cả các tập tin.

Điều này có thể được sắp xếp và sao chép bằng cách loại bỏ nó vào sort -u:

stat -c %U * | sort -u

Như được chỉ ra bởi Steeldo, đây không phải là đệ quy. Tôi đã bỏ lỡ rằng điều này đã được yêu cầu. Nó có thể được thực hiện đệ quy bằng cách kích hoạt globalstar:

shopt -s globstar
stat -c %U **/* | sort -u

Nhìn chung, câu trả lời của Steeldo có lẽ tốt hơn và nên là câu trả lời được chấp nhận ở đây :)


Sẽ không vượt quá độ dài dòng lệnh, nếu có một số lượng lớn tệp trong tìm kiếm? Nếu vậy, câu trả lời của @steeldo là tốt hơn.
CSM

@CSM nó sẽ. Đó là lý do tại sao tôi nói rằng câu trả lời của người thép là một câu hỏi hay hơn trong nhiều trường hợp.
vidarlo

2
@CSM Tôi đoán nếu đó ARG_MAXlà một vấn đề bạn có thể làm printf '%s\0' **/* | xargs -0 stat -c %U(vì printflà nội dung, nó không nên có giới hạn về độ dài như nhau)
Steeldo

5

Bạn có thể thấy hiệu quả hơn khi trực tiếp tìm kiếm các tệp không thuộc sở hữu của người dùng ...

find /directory ! -user username -printf "%u %p\n" 

4

Phương pháp DIY thông qua Python:

#!/usr/bin/env python3
import sys,os,pwd
for f in sys.argv[1:]:
    username = pwd.getpwuid(os.stat(f).st_uid).pw_name
    print( ":".join([f,username])  )

Điều này lặp đi lặp lại trên tất cả các tên tệp được liệt kê trên dòng lệnh, lấy UID của chủ sở hữu tệp và sử dụng mô-đun pwd sẽ có tên người dùng của chủ sở hữu. Sau đó, tên tệp và tên người dùng đã tham gia để in đẹp và được phân tách thông qua dấu hai chấm. Hoạt động như vậy:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.