
特定のディレクトリ内のすべてのファイルとディレクトリの一意の所有者を表示したいと思います。
私は試した:
ls -ltR <dir-path> | grep -P '^[d|\-]' | awk '{print $3}' | sort | uniq
これはls
出力を解析しようとする根本的な間違いを犯しますが、うまくいきます。複雑なディレクトリ構造に多くのファイルがあるディレクトリで試しましたが、停止して中断されました。
単に低レベルでコマンドを実行して段階的に進むことでこの問題を解決できますが、これを一度に実行するより効率的な方法があるかどうか疑問に思います。
答え1
findを使用する少し短いバージョンは次のとおりです。
find <path> -printf "%u\n" | sort -u
ディレクトリ構造の複雑さによっては、この方法がより効率的である場合とそうでない場合があります。
答え2
このような作業のために、私はPerlを分解するのが好きです。File::Find
これには非常に便利なコアと呼ばれるモジュールがあります。
#!/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" );
これは「見つかった順序」で印刷されます。後で照合して並べ替えることができます(必要に応じてファイル数に基づいて)。
foreach my $uid ( sort { $found{$a} <=> $found{$b} } keys %found ) {
print getpwbyuid($uid)," ($uid) has $found{$uid} files\n";
}