วิธีรับรายชื่อเจ้าของไฟล์ทั้งหมดในไดเรกทอรี


14

ฉันกำลังพยายามแก้ไขระบบโควต้าของฉัน ปัญหาของฉันคือฉันไม่สามารถตรวจสอบว่าไฟล์ทั้งหมดในไดเรกทอรีเป็นของผู้ใช้เดียวกัน หากเป็นไปได้มีวิธีการแสดงรายการเจ้าของไฟล์ต่าง ๆ ในไดเรกทอรี (เรียกซ้ำ)

เช่น get-owners-of DIRNAME


1
ดังนั้นคุณต้องการแสดงรายการเจ้าของทั้งหมดเท่านั้นหรือไฟล์ทั้งหมดกับเจ้าของของพวกเขาหรือไฟล์ทั้งหมดที่เป็นของผู้อื่นที่ไม่ใช่ผู้ใช้ที่เฉพาะเจาะจง?
ผู้บัญชาการไบต์

คำตอบ:


25

คุณสามารถใช้findเพื่อพิมพ์ผู้ใช้ (เจ้าของ) และกลุ่มแล้วแยกชุด uniq เช่น

$ 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
เพื่อประเมินไดเรกทอรีเนื้อหาเท่านั้น (และไม่ไดเรกทอรีราก / -ies ของการค้นหาตัวเอง) เพิ่มก่อน-mindepth 1 -printfและฉันจะไม่รวมsudoไว้ในตัวอย่างเมื่อ OP ไม่ทำงานในบริบทที่จำเป็น
David Foerster

ไม่-t:สร้างความแตกต่างในบริบทนี้หรือไม่?
kasperd

@kasperd จุดดี - อาจจะไม่ ( อาจส่งผลกระทบต่อลำดับการจัดเรียง - แต่เราไม่ได้สนใจในเรื่องนั้นจริงๆ)
ช่างเหล็ก

19
stat -c %U * 

จะแสดงรายการเจ้าของไฟล์ทั้งหมด

สิ่งนี้สามารถจัดเรียงและลบออกซ้ำได้โดยการวางลงในsort -u:

stat -c %U * | sort -u

ตามที่ระบุไว้โดยผู้ขับรถเหล็กนี่ไม่ใช่แบบเรียกซ้ำ ฉันพลาดที่นี่ถูกขอ สามารถทำซ้ำได้โดยเปิดใช้งาน globstar:

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

โดยรวมแล้วคำตอบของผู้ขับเหล็กน่าจะดีกว่าและควรเป็นคำตอบที่ได้รับการยอมรับที่นี่ :)


จะไม่เกินความยาวบรรทัดคำสั่งหากมีไฟล์จำนวนมากในการค้นหา? ถ้าเป็นเช่นนั้นคำตอบของ @steeldriver ดีกว่า
CSM

@CSM มันจะ นี่คือเหตุผลที่ฉันบอกว่าคำตอบของนักขับเหล็กนั้นดีกว่าในหลาย ๆ กรณี
vidarlo

2
@CSM ผมคิดว่าถ้าARG_MAXเป็นปัญหาที่คุณสามารถทำprintf '%s\0' **/* | xargs -0 stat -c %U(ตั้งแต่printfเป็น builtin มันไม่ควรมีข้อ จำกัด ที่ยาวเท่ากัน)
steeldriver

5

คุณอาจพบว่ามีประสิทธิภาพมากขึ้นในการค้นหาไฟล์ที่ผู้ใช้ไม่ได้เป็นเจ้าของ ...

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

4

วิธี DIY ผ่าน 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])  )

ซึ่งจะวนซ้ำชื่อไฟล์ทั้งหมดที่อยู่ในบรรทัดคำสั่งรับ UID ของเจ้าของไฟล์และการใช้โมดูลpwdจะได้รับชื่อผู้ใช้ของเจ้าของ หลังจากนั้นชื่อไฟล์และชื่อผู้ใช้เข้าร่วมเพื่อการพิมพ์ที่สวยงามและแยกออกจากลำไส้ใหญ่ ทำงานเป็นเช่นนั้น:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.