Как в Linux узнать путь к файлу?

Biglem

Такая фишка, нужно зная inode файла вывести абсолютный путь к нему.
например f(41431) = "/usr/local/bin/mc"
Это же должно быть возможно.
Может кто знает, я уже две недели бьюсь - все перепробовал, не получается.

abrek

невозможно, кроме как сканированием всей фс
кроме того, не во всех файловых системах есть настоящие иноды с номерами

Biglem

Ясно, тогда задам вопрос по-другому. Как определить уникальность файла?
Например один и тот же файл может быть задан тысячью способов:
some.file
~/somedir/some.file
../somedir/some.file
/home//somedir/somefile
/home//..//somedir/../..//somedir/some.file

etc
А мне нужно знать, что это один и тот же файл

ale-nikono

Анонимус прав.
Хочется добавить, что описанное тобой соответствие (зачастую) не является однозначным.
P.S. Сразу вспомнилась пословица про половину ответа.

abrek

1. символ '~' ядро не понимает, его раскрывает шелл
2. если нужен именно полный путь, есть realpath(3)
3. если нужен сам файл, независимо от имени, то хорошего способа AFAIK нет, можно посмотреть, как это делают tar, cp, rsync, которые умеют детектировать жёсткие ссылки

Filan

Ну ты же знаешь как получить инод файла? По иноду и отличай.
Также можно определить сколько хардлинков на этот инод.
И симлинки тоже легко распознаются.

Biglem

Спасибо за realpath
думаю, это решит мои проблемы
Кстати, насчет неоднозначности - просто, хотел узнать в какой ситуации это может быть не один и тот же файл?

Filan

хотел узнать в какой ситуации это может быть не один и тот же файл?

Иноды разные (с учётом разных разделов).

Biglem

2:
Это да, но хотелось бы просто выводить сообщение типа "ошибка при обработке файла /some/bad/file" вместо "ошибка при обработке файла с инодом 31337" может выглядеть не очень информативно - я например не знаю, как этот файл найти

abrek

почему бы не указывать в сообщении то имя, которое и использовалось для работы, как это делают все?

Filan

На каждый файл структура из двух полей - имя и инод.
Различать по иноду, а выводить имя.
В чём вопрос?

Biglem

имя локальное, а прога лазит по всему диску - получается надо знать еще и каталог, где файл был взят
я наверное всех запутал - в общем, прога обрабатвает в фалах фишки типа #include "foo.bar" и в этом месте вставляет этот файл. А в том файле может быть опять #include "bar.foo" и т.д - это делается рекурсией и вдруг где-то встречается #include file - это ошибка, а как узнать какой это файл?

Biglem

2: ну в общем-то, я уже так и сделал - вопрос только в выводе абсолютного пути
А честно говоря, я уже просто увлекся разговором с умными людьми - проблема в принципе решена

abrek

если сама ползает, то знает, где находится
Оставить комментарий
Имя или ник:
Комментарий: