我想查看某个目录下所有文件和目录的唯一所有者。
我努力了:
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
which is core 的模块,对此非常有用:
#!/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";
}