Как можно видеть фактическую жесткую ссылку ls?

Я работаю

ln /a/A /b/B

Я хотел бы видеть в папке a где файл точки к ls.

99
задан 19.08.2012, 17:41

4 ответа

Можно найти inode число для файла с

ls -i

и

ls -l

выставочное ссылочное количество (количество hardlinks к конкретному inode)

после нахождения inode числа можно искать все файлы с тем же inode:

find . -inum NUM

покажет имена файлов для inode ЦИФРЫ в текущем dir (.)

173
ответ дан 07.12.2019, 07:54

Нет действительно четко определенного ответа на Ваш вопрос. В отличие от символьных ссылок, hardlinks неразличимы из "исходного файла".

Записи каталога состоят из имени файла и указателя на inode. inode в свою очередь содержит метаданные файла и (указатели на) фактическое содержание файла). Создание жесткой ссылки создает другое имя файла + ссылка на тот же inode. Эти ссылки однонаправлены (в типичных файловых системах, по крайней мере) - inode только проводит подсчет ссылок. Нет никакого внутреннего способа узнать, который является "исходным" именем файла.

Между прочим, это - то, почему системный вызов для "удаления" файла называют unlink. Это просто удаляет hardlink. inode приложенные данные удалены, только если подсчет ссылок inode спадает 0.

Единственный способ найти другие ссылки на данный inode состоит в том, чтобы исчерпывающе искать по файловой системе, проверяющей, какие файлы относятся к inode рассматриваемому. Можно использовать, 'тестируют-ef B' от оболочки для выполнения этой проверки.

65
ответ дан 07.12.2019, 07:54
  • 1
    Это означает, что нет такой вещи как жесткая ссылка на другой файл, как исходный файл является также жесткой ссылкой; жесткие ссылки указывают на местоположение на диске. – jtbandes 26.07.2009, 03:03

UNIX имеет жесткие ссылки и символьные ссылки (сделанный с "ln" и "ln -s" соответственно). Символьные ссылки являются просто файлом, который содержит реальный путь к другому файлу и может пересечь файловые системы.

Жесткие ссылки были вокруг с самых ранних дней UNIX (что я могу помнить так или иначе, и это возвращается долгое время). Они - две записи каталога что ссылка те же самые базовые данные. Данные в файле указаны inode. Каждый файл в файловой системе указывает на inode, но нет никакого требования, чтобы каждая точка файла к уникальному inode - это было то, куда жесткие ссылки прибывают из.

Так как inodes уникальны только для данной файловой системы, существует ограничение, что жесткие ссылки должны быть в той же файловой системе (в отличие от символьных ссылок). Обратите внимание, что, в отличие от символьных ссылок, нет никакого привилегированного файла - они все равны. Область данных будет только выпущена, когда все файлы с помощью этого, inode удалены (и все процессы близко это также, но это - другой вопрос).

Можно использовать "ls -i" команда для получения inode конкретного файла. Можно затем использовать "find <filesystemroot> -inum <inode>" управляйте для нахождения всех файлов в файловой системе с данными inode.

Вот сценарий, который делает точно это. Вы вызываете его с:

findhardlinks ~/jquery.js

и это найдет все файлы в той файловой системе, которые являются жесткими ссылками для того файла:

pax@daemonspawn:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
   '/home/pax/jquery.js' has inode 5211995 on mount point '/'
       /home/common/jquery-1.2.6.min.js
       /home/pax/jquery.js

Вот сценарий.

#!/bin/bash
if [[ $# -lt 1 ]] ; then
    echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
    exit 1
fi

while [[ $# -ge 1 ]] ; do
    echo "Processing '$1'"
    if [[ ! -r "$1" ]] ; then
        echo "   '$1' is not accessible"
    else
        numlinks=$(ls -ld "$1" | awk '{print $2}')
        inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
        device=$(df "$1" | tail -1l | awk '{print $6}')
        echo "   '$1' has inode ${inode} on mount point '${device}'"
        find ${device} -inum ${inode} 2>/dev/null | sed 's/^/        /'
    fi
    shift
done
33
ответ дан 07.12.2019, 07:54
  • 1
    @pax: в сценарии, кажется, существует ошибка. Я запускаю его . ./findhardlinks.bash будучи в Zsh OS X. Мое текущее окно в Экранных завершениях. –  25.07.2009, 19:31
  • 2
    @Masi проблема является Вашей начальной буквой. (то же как исходная команда). Это заставляет выход 1 команда выходить из Вашей оболочки. Используйте chmod a+x findhardlinks.bash, затем выполняют его с./findhardlinks.bash или используют findhardlinks.bash – njsf 26.07.2009, 02:08
  • 3
ls -l

Первый столбец представит полномочия. Второй столбец будет количеством подэлементов (для каталогов) или количеством путей к тем же данным (жесткие ссылки, включая исходный файл) в файл. Например:

-rw-r--r--@    2    [username]    [group]    [timestamp]     HardLink
-rw-r--r--@    2    [username]    [group]    [timestamp]     Original
               ^ Number of hard links to the data
24
ответ дан 07.12.2019, 07:54

Теги

Похожие вопросы