파일 및 디렉터리의 고유 소유자를 효율적으로 검색합니다.

파일 및 디렉터리의 고유 소유자를 효율적으로 검색합니다.

특정 디렉터리에 있는 모든 파일과 디렉터리의 고유 소유자를 보고 싶습니다.

나는 시도했다:

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

관련 정보