Как я могу сказать, что два файла жестко связаны из командной строки? например, что-то связать это:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
В большинстве файловых систем¹ файл однозначно определяется номером его инода , поэтому все, что вам нужно, это проверить, имеют ли два файла одинаковый номер инода и находятся ли они в одной файловой системе.
У Ash, ksh, bash и zsh есть конструкция, которая проверяет вас: оператор равенства файлов -ef
.
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
Для более сложных случаев ls -i /path/to/file
перечисляет номер инода файла. df -P /path/to/file
показывает, в какой файловой системе находится файл (если два файла находятся в одном каталоге, они находятся в одной файловой системе). Если в вашей системе есть stat
команда, возможно, она отображает номера inode и файловой системы ( stat
зависит от системы, проверьте документацию). Если вы хотите быстро взглянуть на жесткие ссылки внутри каталога, попробуйте ls -i | sort
(возможно, по каналу awk ).
¹ Все нативные файловые системы Unix и некоторые другие, такие как NTFS, но, возможно, не такие экзотические, как CramFS.
fileA -ef fileB
также возвращается0
(успех), еслиfileA
является символическойfileB
ссылкой, или наоборот, или они оба ссылаются на один и тот же файл.[ .bashrc -ef .bash/.bashrc ]
правильный. Без контекста, конечно, я понятия не имею, почему это «на самом деле не работает» - вы могли бы сравнивать неправильные файлы, вы могли бы не проверять результат правильно, вы могли бы использовать оболочку без-ef
…[
и является синонимомtest
. Ноman [
илиman test
даст вам страницу руководства по внешней команде, в то время как практически в каждой оболочке есть встроенная команда с немного отличающимися параметрами, поэтому вам нужно найти ее в руководстве по вашей оболочке.источник
stat -c %d
). И если вы работаете в Linux (учитывая вашуstat
команду), ваша оболочка[ fileA -ef fileB ]
должна делать все это напрямую. Кроме того, ваша команда произвольно разрывается с именами файлов, содержащими пробелы или\[?*
, или начинается с-
: всегда ставьте двойные кавычки вокруг команды susbtitutions ("$(stat -c %i -- "$1")"
).function
ключевое слово с именем функции, которое (из-за наличия тире) нарушает соглашения POSIX по разрешенным именам?$1
и$2
. Вы можете также захотеть использовать$()
синтаксис вместо обратных кавычек, потому что квадратные скобки проясняют, где начинается команда и где она заканчивается, а вложение проще.Как следует из первого постера, вы можете написать скрипт на основе чего-то подобного в Linux:
источник
stat -c %d
). И если вы работаете в Linux (учитывая вашуstat
команду), ваша оболочка[ fileA -ef fileB ]
должна делать все это напрямую.С GNU
find(1)
версии 4.2.11 или новее вы также можете использовать это:Если
fileA
это тот же файл, что иfileB
тогда,find
будет напечатано «да», и условие станет истинным.В отличие от использования оператора равенства файлов,
-ef
это порождает новый процесс.источник