2015-01-25 4 views
1

Мне нужно перечислить все жесткие ссылки заданного файла в «чистом» C, поэтому без помощи команд bash.Перечислить жесткие ссылки файла C

Я гугл в течение нескольких часов, но не нашел ничего полезного. Моя идея состоит в том, чтобы получить номер inode, затем прокрутить каталог, чтобы найти файлы с таким же inode.

В Баш-то вроде

sudo find/-inum 199053 

Все лучшее предложение?

Благодаря

+0

Это кажется UNIX-специфические, поэтому я добавил тег для вас. –

+1

По крайней мере, вы можете сделать оптимизацию коротких замыканий, используя 'stat', чтобы узнать количество жестких ссылок * n * и прервать обход файловой системы после того, как вы нашли * n * ссылки (или полностью избегаете в случае of * n * = 1). Но кроме этого я не знаю более эффективного решения. – 5gon12eder

+1

Вы хотите запустить 'find' из точки монтирования файловой системы (которая может быть или не быть'/') и использовать опцию' -xdev', чтобы оставаться внутри этой файловой системы (поскольку жесткие ссылки не могут пересекать файловую систему границы). Я не думаю, что есть лучший способ сделать это. Зачем вам нужно делать это в «чистом С»? Команда 'find', скорее всего, будет не менее эффективной, чем вы можете писать. –

ответ

2

Чтобы получить номер иноды одного файла, вызовите функцию stat и ссылаться на значение st_ino возвращаемой структуры.

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

Вы можете создать решение с функцией стата с помощью opendir, readdir и closedir рекурсивно сканировать иерархию каталогов для поиска соответствия значений индексных дескрипторов.

Вы также можете использовать 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; 
} 
Смежные вопросы