Filtre os arquivos de acordo com o proprietário no mesmo diretório

3

Estou escrevendo um script que tem um diretório comum e, sob esse diretório, há alguns arquivos com diferentes proprietários.

Como posso filtrar os arquivos de acordo com o proprietário com seus arquivos e analisá-los separadamente com o nome do proprietário como nome de arquivo:

/gen/comm_owner/a 
/gen/comm_owner/b 

Existem mais de 20 proprietários com mais de 60 arquivos. saída esperada gen/comm_owner/a.txt , onde a.txt contém apenas seus arquivos, da mesma forma para b.txt . Eu tentei awk e sed e eu sou capaz de filtrar algumas coisas, mas como fazer isso?

    
por shekhar 09.11.2016 / 13:13

2 respostas

4
find /some/path -type f -printf "%u/%P\n" | awk -F/ '{u=; sub("/", ""); print > u}'
  • A opção find -printf é muito poderosa. Nesse caso, digo a ele que imprima o nome de usuário e o caminho de arquivo relativo separados por uma barra (por exemplo, muru/foo/bar (ou você pode usar %p em vez de %P , para muru//some/path/foo/bar ).
  • Em seguida, em awk , dividindo em / , salve o primeiro campo (o nome de usuário), remova-o da entrada e imprima a entrada para esse nome de usuário.

Exemplo:

$ find /var/lib -type f -printf "%u/%p\n" | awk -F/ '{u=; sub("/", ""); 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
    
por muru 09.11.2016 / 14:14
3

Você pode usar o -user test para find e passar seus nomes de usuário para ele com um loop. Aqui está um exemplo com apenas dois usuários:

for users in zanna pixie; do find /gen -type f -user "$users"  > /gen/comm_owner/"$users".txt ; done

zanna e pixie são usuários no meu sistema. Isso cria dois arquivos chamados zanna.txt com uma lista de arquivos de propriedade de zanna e pixie.txt com uma lista de arquivos de propriedade de pixie

Os nomes de arquivos nos arquivos estão exatamente no formulário relatado por find com este exemplo, mas você pode ajustar isso, por exemplo, você poderia -exec basename '{}' \; antes do redirecionamento para evitar ter o caminho completo.

    
por Zanna 09.11.2016 / 13:31