Как определить жесткую ссылку с помощью Python?

Я хотел бы знать, можно ли определить, является ли файл (или ссылка) жесткой ссылкой или нет в Linux. Например, если я создал:

dd if=/dev/urandom bs=1024 count=10000 of=file_10MB conv=notrunc
ln file_10MB file_10MB_link1

Я хотел бы создать функцию проверки, которую можно было бы использовать так:

if is_hardlink("file_10MB_link1"):
    pass

Как я могу использовать Python, чтобы проверить, является ли файл жесткой ссылкой?


person uilianries    schedule 17.04.2020    source источник


Ответы (3)


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

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

person Barmar    schedule 17.04.2020

Я считаю, что вы ищете "файлы, у которых количество ссылок больше 1"

для этого вы можете использовать:

def more_than_one_link(filename):
    os.stat(filename).st_nlink > 1
person Anthony Sottile    schedule 17.04.2020
comment
Я думаю, ему нужна функция, которая будет верна для file_10MB_link1, но ложна для file_10MB. Проверка количества ссылок этого не сделает, так как они оба вернут st_nlink == 2 - person Barmar; 18.04.2020
comment
@Barmar такого нет - это один и тот же индекс - person Anthony Sottile; 18.04.2020
comment
Я знаю, это то, что я сказал в своем ответе. - person Barmar; 18.04.2020
comment
Я ценю ваши ответы, но, как сказал @Barmar, мне нужно определить жесткую ссылку, не считая узлов, в противном случае мне нужно будет проверить каждый файл для каждой папки. Похоже, для этого случая нет подходящего варианта, поэтому я приму код. Большое спасибо! - person uilianries; 18.04.2020
comment
Вы пытаетесь выяснить, жесткая ли это ссылка на конкретный файл? Вы можете проверить номера устройства и inode, чтобы убедиться, что они совпадают. - person Barmar; 18.04.2020
comment
Понятно, вот и ищу! - person uilianries; 19.04.2020

Ответ заключается в том, что это зависит от используемой файловой системы и (точной) ОС. Например, если вы используете NTFS (что маловероятно в собственном контексте Linux), она допускает широкий диапазон Специфичные для NTFS функции, включая жесткие ссылки и переходы. Таким образом, в то время как в Windows для жестких ссылок используются номера ссылок, в ОС Linux используются inodes.

Вам потребуются определенные драйверы ядра или криминалистическая ОС, чтобы иметь возможность читать все это, поскольку нормальный Linux использует только inodes, и для этого потребуется подсчет и отметка времени проанализированы, чтобы решить, что является исходным файлом или созданными позже жесткими ссылками.

Поскольку python может создавать как жесткие ссылки, так и < em> softlinks через:

os.link()    # Create a hard link
os.symlink() # Create a symbolic link

(TL; DR длинные документы выше) должен быть способ проверить тип ссылки, хотя для этого может потребоваться довольно небольшая обработка диска (поиск и сравнение).

Для точного обнаружения проверьте встроенные функции ОС, описанные в этом ответе.
[islink (), parse_reparse_buffer (), readlink ()]

person not2qubit    schedule 19.10.2020