Pesquisa eficiente de proprietários únicos de arquivos e diretórios

2

Eu gostaria de ver os proprietários únicos de todos os arquivos e diretórios abaixo de um determinado diretório.

Eu tentei:

ls -ltR <dir-path> | grep -P '^[d|\-]' | awk '{print $3}' | sort | uniq

O que comete o pecado principal de tentar analisar ls output, mas funciona - até eu testá-lo em um diretório com uma quantidade imensa de arquivos dentro de uma estrutura de diretórios complexa onde ele fica parado e trava.

Enquanto eu poderia trabalhar e simplesmente fazer o comando em níveis mais baixos e trabalhar peça por peça, eu queria saber se existe uma maneira mais eficiente de fazer isso de uma só vez?

    
por mlegge 06.05.2015 / 18:10

2 respostas

3

Aqui está uma versão ligeiramente mais curta que usa find:

find <path> -printf "%u\n" | sort -u

Dependendo da complexidade da estrutura de diretórios, isso pode ou não ser mais eficiente.

    
por 06.05.2015 / 18:24
2

Para esse tipo de tarefa, gosto de quebrar o perl. Existe um módulo chamado File::Find que é o core, que é muito bom para isso:

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;

my %found;

sub collate_users {
    next if -d;
    my ($dev,  $ino,   $mode,  $nlink, $uid,     $gid, $rdev,
        $size, $atime, $mtime, $ctime, $blksize, $blocks
    ) = stat;

    if ( not $found{$uid} ) {
        print "$uid : ", getpwuid($uid),"\n";
    }
    $found{$uid}++;
}

find( \&collate_users, "/path/to/search", "/another/path/to/search" );

Isso será impresso em 'ordem encontrada' - você poderá, se preferir, agrupar e classificar (contando os arquivos, se desejar) posteriormente:

foreach my $uid ( sort { $found{$a} <=> $found{$b} } keys %found ) {
    print getpwbyuid($uid)," ($uid) has $found{$uid} files\n";
}
    
por 06.05.2015 / 18:38