특정 디렉터리에 있는 모든 파일과 디렉터리의 고유 소유자를 보고 싶습니다.
나는 시도했다:
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
이를 위해 매우 유용한 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";
}