У меня есть скрипт для рекурсивного создания символических ссылок в моем домашнем каталоге на мой каталог настроек, чтобы держать файлы под контролем версий. Я хотел бы, чтобы он пропускал файлы, которые уже имеют ссылки через родительский каталог. То есть, если у меня есть эти файлы / каталоги:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
Как проверить, что ~ / foo / bar и ~ / settings / foo / bar - это один и тот же файл?
Изменить : D'Oh, еще несколько минут поиска показали ответ :readlink -f $path
linux
symbolic-link
l0b0
источник
источник
stat -L
.Во многих оболочках есть встроенный
-ef
операторtest
(или его синоним[
) для проверки, указывают ли два пути на один и тот же существующий файл (по символическим ссылкам). Это включает в себя bash, dash, pdksh, ksh88, ksh93 и zsh, но не POSIX sh. В Баш, KSH или Zsh, вы можете также использовать-ef
в[[ … ]]
условной конструкции.источник
-ef
в том, что он более переносим (также немного быстрее, но не настолько, чтобы вы заметили большую часть времени). Например, он работает на * BSD, OSX, BusyBox, а также на Linux / Cygwin (GNU). Это также более понятно, поскольку это именно то, что требуется. Единственное преимущество, которое я вижу в звонках,stat
- это когда ты не хочешь следовать символическим ссылкам.Для программных ссылок (созданных с помощью
ln -s
) вы можете использоватьrealpath
. Это не будет работать для жестких ссылок, хотя.источник