Я работаю
ln /a/A /b/B
Я хотел бы видеть в папке a
где файл точки к ls
.
Можно найти inode число для файла с
ls -i
и
ls -l
выставочное ссылочное количество (количество hardlinks к конкретному inode)
после нахождения inode числа можно искать все файлы с тем же inode:
find . -inum NUM
покажет имена файлов для inode ЦИФРЫ в текущем dir (.)
Нет действительно четко определенного ответа на Ваш вопрос. В отличие от символьных ссылок, hardlinks неразличимы из "исходного файла".
Записи каталога состоят из имени файла и указателя на inode. inode в свою очередь содержит метаданные файла и (указатели на) фактическое содержание файла). Создание жесткой ссылки создает другое имя файла + ссылка на тот же inode. Эти ссылки однонаправлены (в типичных файловых системах, по крайней мере) - inode только проводит подсчет ссылок. Нет никакого внутреннего способа узнать, который является "исходным" именем файла.
Между прочим, это - то, почему системный вызов для "удаления" файла называют unlink
. Это просто удаляет hardlink. inode приложенные данные удалены, только если подсчет ссылок inode спадает 0.
Единственный способ найти другие ссылки на данный inode состоит в том, чтобы исчерпывающе искать по файловой системе, проверяющей, какие файлы относятся к inode рассматриваемому. Можно использовать, 'тестируют-ef B' от оболочки для выполнения этой проверки.
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
. ./findhardlinks.bash
будучи в Zsh OS X. Мое текущее окно в Экранных завершениях.
–
25.07.2009, 19:31
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