我正在编写一个具有公共目录的脚本,并且该目录下有一些具有不同所有者的文件。
我如何根据文件所有者过滤文件并使用其所有者名称作为文件名分别解析它们:
/gen/comm_owner/a
/gen/comm_owner/b
有超过 20 位所有者拥有超过 60 个文件。预期输出gen/comm_owner/a.txt
,其中a.txt
仅包含他的文件,同样适用于b.txt
。我已经尝试过awk
并且sed
能够过滤某些内容,但是如何执行此操作?
答案1
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
答案2
您可以使用-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 '{}' \;
在重定向之前避免使用完整路径。