Cara mendapatkan daftar semua pemilik file dalam direktori

14

Saat ini saya sedang mencoba untuk memperbaiki sistem kuota saya. Masalah saya adalah bahwa saya tidak dapat menentukan apakah semua file dalam direktori dimiliki oleh pengguna yang sama. Jika memungkinkan apakah ada cara untuk membuat daftar berbagai pemilik file dalam direktori (secara rekursif).

misalnya get-owners-of DIRNAME

Jack7076
sumber
1
Jadi, apakah Anda ingin membuat daftar semua pemilik saja, atau semua file dengan pemiliknya, atau semua file yang dimiliki oleh orang lain selain pengguna tertentu?
Byte Commander

Jawaban:

25

Anda dapat menggunakan finduntuk mencetak pengguna (pemilik) dan grup dan kemudian mengekstrak kombinasi unik misalnya

$ 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
Steeldriver
sumber
1
Untuk mengevaluasi konten direktori saja (dan bukan direktori root / -ies pencarian itu sendiri) tambahkan -mindepth 1sebelumnya -printf. Dan saya tidak akan memasukkan sudodalam contoh ketika OP tampaknya tidak berfungsi dalam konteks di mana itu diperlukan.
David Foerster
Apakah -t:ada perbedaan dalam konteks ini?
kasperd
@kasperd poin bagus - mungkin tidak ( mungkin mempengaruhi urutan sortir - tapi kami tidak benar-benar tertarik pada hal itu)
steeldriver
19
stat -c %U * 

akan mencantumkan pemilik semua file.

Ini dapat disortir dan duplikat dihapus dengan memipangnya ke sort -u:

stat -c %U * | sort -u

Seperti yang ditunjukkan oleh steeldriver, ini bukan rekursif. Saya merindukan bahwa ini diminta. Itu dapat dibuat rekursif dengan mengaktifkan globstar:

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

Secara keseluruhan, jawaban steeldriver mungkin lebih baik dan harus menjadi jawaban yang diterima di sini :)

vidarlo
sumber
Bukankah itu melampaui panjang baris perintah, jika ada banyak file dalam pencarian? Jika demikian, maka jawaban @steeldriver lebih baik.
CSM
@ CSM itu akan. Itulah sebabnya saya mengatakan bahwa jawaban steeldrivers lebih baik dalam banyak kasus.
vidarlo
2
@ CSM Saya kira jika ARG_MAXmasalah yang bisa Anda lakukan printf '%s\0' **/* | xargs -0 stat -c %U(karena printfadalah builtin, seharusnya tidak memiliki batasan panjang yang sama)
steeldriver
5

Anda mungkin merasa lebih efisien untuk langsung mencari file yang tidak dimiliki oleh pengguna ...

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

Metode DIY melalui 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])  )

Ini mengulangi semua nama file yang terdaftar pada command-line, mendapatkan UID dari pemilik file, dan menggunakan modul pwd mendapatkan nama pengguna pemilik. Setelah itu, nama file dan nama pengguna bergabung untuk pencetakan cantik dan dipisahkan melalui titik dua. Bekerja seperti itu:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Sergiy Kolodyazhnyy
sumber