根据所有者过滤同一目录下的文件

根据所有者过滤同一目录下的文件

我正在编写一个具有公共目录的脚本,并且该目录下有一些具有不同所有者的文件。

我如何根据文件所有者过滤文件并使用其所有者名称作为文件名分别解析它们:

/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代替%Pmuru//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

zannapixie都是我系统上的用户。这将创建两个文件,分别名为 和 ,前者zanna.txt包含 所拥有文件的文本列表zanna,后者pixie.txt包含 所拥有文件的文本列表。pixie

文件中的文件名与本例报告的格式完全一致find,但您可以对其进行调整,例如,您可以-exec basename '{}' \;在重定向之前避免使用完整路径。

相关内容