Bir dizindeki tüm dosya sahiplerinin listesi nasıl alınır


14

Şu anda kota sistemimi düzeltmeye çalışıyorum. Benim sorunum, bir dizindeki tüm dosyaların aynı kullanıcıya ait olup olmadığını belirleyemiyorum. Mümkünse, bir dizindeki farklı dosya sahiplerini listelemenin bir yolu vardır (özyinelemeli olarak).

Örneğin get-owners-of DIRNAME


1
Öyleyse yalnızca tüm sahipleri mi yoksa sahipleriyle olan tüm dosyaları mı yoksa belirli bir kullanıcı dışında herhangi birinin sahip olduğu tüm dosyaları mı listelemek istiyorsunuz?
Byte Komutanı

Yanıtlar:


25

Sen kullanabilirsiniz findkullanıcı (sahip) ve grup yazdırmak ve daha sonra uniq kombinasyonları örneğin ayıklamak

$ 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
Yalnızca dizin içeriğini değerlendirmek için (ve aramanın kök dizinini / -ies'ini değil) -mindepth 1önce ekleyin -printf. Ve sudoOP'nin gerekli olduğu bir bağlamda işe yaramadığı durumlarda örneğe dahil etmem.
David Foerster

-t:Bu bağlamda bir fark yaratır mı ?
kasperd

@kasperd iyi noktası - muhtemelen (değil belki sıralama düzeni etkileyen - ama biz gerçekten bu ilgilenen değiliz)
steeldriver

19
stat -c %U * 

tüm dosyaların sahiplerini listeler.

Bu sıralanabilir ve kopyalar, aşağıdakilere borularak kaldırılabilir sort -u:

stat -c %U * | sort -u

Steeldriver tarafından işaret edildiği gibi, bu özyinelemeli değildir. Bunun istendiğini kaçırdım. Globstar'ı etkinleştirerek tekrarlamalı hale getirilebilir:

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

Hep birlikte , steeldriver'ın cevabı muhtemelen daha iyidir ve burada kabul edilen cevap olmalıdır :)


Aramada çok sayıda dosya varsa, komut satırı uzunluğunu aşmaz mı? Eğer öyleyse, @steeldriver'ın cevabı daha iyidir.
CSM

@CSM olacak. Bu yüzden steeldrivers cevabının birçok durumda daha iyi olduğunu söylüyorum.
vidarlo

2
@CSM Sanırım ARG_MAXyapabileceğiniz bir sorun varsa printf '%s\0' **/* | xargs -0 stat -c %U( printfyerleşik bir yapı olduğu için aynı uzunluk sınırlamasına sahip olmamalıdır)
steeldriver

5

Kullanıcının sahip olmadığı dosyaları doğrudan aramak daha verimli olabilir ...

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

4

Python ile DIY yöntemi:

#!/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])  )

Bu, komut satırında listelenen tüm dosya adlarını yineler, dosyanın sahibinin UID'sini alır ve pwd modülünü kullanarak sahibin kullanıcı adını alır. Bundan sonra, dosya adı ve kullanıcı adı güzel baskı için katıldı ve iki nokta üst üste ile ayrıldı. Şu şekilde çalışır:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.