Я пишу сценарий, который имеет общий каталог и под теми каталог, там некоторые файлы с различными владельцами.
Как может я фильтровать файлы по словам владельца с их файлами и анализировать их отдельно с их именем владельца как имя файла:
/gen/comm_owner/a
/gen/comm_owner/b
Существует больше чем 20 владельцев больше чем с 60 файлами. ожидаемый вывод gen/comm_owner/a.txt
, где a.txt
содержит только его файлы, аналогично для b.txt
. Я попробовал awk
и sed
и я могу отфильтровать некоторые вещи, но как выполнить это?
find /some/path -type f -printf "%u/%P\n" | awk -F/ '{u=$1; sub($1"/", ""); print > u}'
find
-printf
опция очень мощна. В этом случае я говорю этому печатать имя пользователя и путь файла прямого доступа, разделенный наклонной чертой (например, muru/foo/bar
(или Вы могли использовать %p
вместо %P
, для muru//some/path/foo/bar
). awk
, разделяя на /
, я сохраняю первое поле (имя пользователя), удаляю его из входа и затем печатаю вход к тому имени пользователя. Пример:
$ find /var/lib -type f -printf "%u/%p\n" | awk -F/ '{u=$1; sub($1"/", ""); print > u}'
$ ls
colord nobody ntp ptokax root systemd-timesync
$ head ntp
/var/lib/ntp/ntp.drift
$ head nobody
/var/lib/nfs/state
$ head root
/var/lib/dbus/machine-id
/var/lib/os-prober/labels
/var/lib/xkb/README.compiled
/var/lib/logrotate.status
/var/lib/nfs/rmtab
Вы могли использовать эти -user
тест к find
и передать свои имена пользователей ему с циклом. Вот пример со всего двумя пользователями:
for users in zanna pixie; do find /gen -type f -user "$users" > /gen/comm_owner/"$users".txt ; done
zanna
и pixie
пользователи в моей системе. Это создает два файла, названные zanna.txt
с текстовым списком файлов, принадлежавших zanna
, и pixie.txt
с текстовым списком файлов, принадлежавших pixie
, имена файлов в файлах находятся точно в форме, о которой сообщают find
с этим примером, но Вы могли скорректировать это, например, Вы могли -exec basename '{}' \;
перед перенаправлением, чтобы не иметь полный путь.