2015-01-25 5 views
1

주어진 파일의 모든 하드 링크를 "순수한"C로 나열해야하므로 bash 명령을 사용하지 않아도됩니다.파일의 하드 링크 나열 C

나는 몇 시간 동안 인터넷 검색을했지만 유용한 정보가 없습니다. 현재 나의 inode 번호는 inode 번호를 얻은 다음 디렉토리를 반복하여 동일한 inode를 가진 파일을 찾습니다.

sudo find/-inum 199053 

더 좋은 제안과 같은 bash는 뭔가에

?

감사

+0

이것은 UNIX 특정 보인다, 그래서 나는 당신을 위해 태그를 추가했습니다. –

+1

최소한,'stat'를 사용하여 하드 링크 * n *를 찾아서 * n * 링크를 찾은 후에 파일 시스템 통과를 중지하여 단락 회로 최적화를 수행 할 수 있습니다. * n * = 1). 그러나 이것과 별개로 나는 더 효율적인 해결책을 모른다. – 5gon12eder

+1

파일 시스템의 마운트 지점 ('/'일 수도 있고 아닐 수도 있음)에서'find'를 시작하고'-xdev' 옵션을 사용하여 파일 시스템을 유지하기를 원할 것입니다 (하드 링크가 파일 시스템 경계). 나는 더 좋은 방법이 있다고 생각하지 않는다. 왜 당신은 "순수한 C"에서 그것을 할 필요가 있습니까? 'find' 명령은 적어도 여러분이 작성할 수있는 것만 큼 효율적일 것입니다. –

답변

2

stat 함수를 호출, 하나의 파일의 inode 번호를 얻을 반환 된 구조체의 st_ino 값을 참조하십시오.

int result; 
struct stat s; 
result = stat("filename.txt", &s); 
if ((result == 0) && (s.st_ino == 199053)) 
{ 
    // match 
} 

당신은 반복적으로 아이 노드 값을 일치를 찾기 위해 디렉토리 계층 구조를 스캔 opendir, readdirclosedir를 사용하여 통계 기능을 가진 솔루션을 구축 할 수 있습니다.

또한 전체 디렉토리를 스캔 scandir을 사용할 수

int filter(const struct dirent* entry) 
{ 
    return (entry->d_ino == 199053) ? 1 : 0; 
} 

int main() 
{ 
    struct dirent **namelist = NULL; 
    scandir("/home/selbie", &namelist, filter, NULL); 
    free(namelist); 
    return 0; 
}