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.
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?
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";
}