Как получить список всех владельцев файлов в каталоге

Я не думаю, что это возможно, потому что другие процессы с низким уровнем ввода-вывода (как и само ядро), вероятно, просто игнорируют ваш модуль ядра и вызывают хаос. Помимо этого, это может вызвать серьезные проблемы с производительностью, поскольку каждая программа, которая открывает поток данных ввода-вывода, должна пройти через ваш модуль. Это, конечно, звучит круто, но я не думаю, что это стоит без помощи опытных разработчиков ядра.

11
задан 23 April 2018 в 00:09

12 ответов

stat -c %U * 

отобразит список всех файлов.

Это можно сортировать и дублировать, удалив, перебирая его на sort -u:

stat -c %U * | sort -u

Как указано steeldriver, это не рекурсивно. Я пропустил, что этого просили. Это может быть сделано рекурсивным путем включения globstar:

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

В общем случае ответ steeldriver, вероятно, лучше и должен быть принят здесь:)

19
ответ дан 22 May 2018 в 11:19
  • 1
    Не будет ли проходить через длину командной строки, если в поиске есть большое количество файлов? Если это так, то ответ @steeldriver лучше. – CSM 21 April 2018 в 20:00
  • 2
    @CSM это будет. Вот почему я говорю, что во многих случаях ответ steeldrivers является лучшим. – vidarlo 21 April 2018 в 20:01
  • 3
    @CSM Я думаю, если ARG_MAX является проблемой, которую вы могли бы сделать printf '%s\0' **/* | xargs -0 stat -c %U (поскольку printf является встроенным, он не должен иметь одинаковое ограничение длины) – steeldriver 21 April 2018 в 20:09
stat -c %U *

отобразит список всех файлов.

Это можно сортировать и дублировать, удалив, перебирая его на sort -u:

stat -c %U * | sort -u

Как указано steeldriver, это не рекурсивно. Я пропустил, что этого просили. Это может быть сделано рекурсивным путем включения globstar:

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

В общем случае ответ steeldriver, вероятно, лучше и должен быть принят здесь:)

19
ответ дан 17 July 2018 в 16:26
stat -c %U *

отобразит список всех файлов.

Это можно сортировать и дублировать, удалив, перебирая его на sort -u:

stat -c %U * | sort -u

Как указано steeldriver, это не рекурсивно. Я пропустил, что этого просили. Это может быть сделано рекурсивным путем включения globstar:

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

В общем случае ответ steeldriver, вероятно, лучше и должен быть принят здесь:)

19
ответ дан 23 July 2018 в 17:19

Вы можете использовать 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
20
ответ дан 22 May 2018 в 11:19
  • 1
    Чтобы оценить только каталог content (а не корневой каталог / -ы самого поиска), добавьте -mindepth 1 до -printf. И я бы не включил sudo в пример, когда OP не работает в контексте, где это необходимо. – David Foerster 22 April 2018 в 01:54
  • 2
    Отличается ли -t: в этом контексте? – kasperd 23 April 2018 в 01:55
  • 3
    @kasperd хорошая точка - возможно, не (это может повлиять на порядок сортировки - но нас это действительно не интересует) – steeldriver 23 April 2018 в 04:06

Вы можете найти более эффективным для прямого поиска файлов, не принадлежащих пользователю ...

find /directory ! -user username -printf "%u %p\n" 
5
ответ дан 22 May 2018 в 11:19

Метод 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
. . .
4
ответ дан 22 May 2018 в 11:19

Вы можете найти более эффективным для прямого поиска файлов, не принадлежащих пользователю ...

find /directory ! -user username -printf "%u %p\n"
5
ответ дан 17 July 2018 в 16:26

Метод 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 . . .
4
ответ дан 17 July 2018 в 16:26

Вы можете использовать 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
20
ответ дан 17 July 2018 в 16:26

Вы можете найти более эффективным для прямого поиска файлов, не принадлежащих пользователю ...

find /directory ! -user username -printf "%u %p\n"
5
ответ дан 23 July 2018 в 17:19

Метод 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 . . .
4
ответ дан 23 July 2018 в 17:19

Вы можете использовать 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
20
ответ дан 23 July 2018 в 17:19
  • 1
    Чтобы оценить только каталог content (а не корневой каталог / -ы самого поиска), добавьте -mindepth 1 до -printf. И я бы не включил sudo в пример, когда OP не работает в контексте, где это необходимо. – David Foerster 22 April 2018 в 01:54
  • 2
    Отличается ли -t: в этом контексте? – kasperd 23 April 2018 в 01:55
  • 3
    @kasperd хорошая точка - возможно, не (это может повлиять на порядок сортировки - но нас это действительно не интересует) – steeldriver 23 April 2018 в 04:06

Другие вопросы по тегам:

Похожие вопросы: