11

У меня есть скрипт для рекурсивного создания символических ссылок в моем домашнем каталоге на мой каталог настроек, чтобы держать файлы под контролем версий. Я хотел бы, чтобы он пропускал файлы, которые уже имеют ссылки через родительский каталог. То есть, если у меня есть эти файлы / каталоги:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

Как проверить, что ~/foo/bar и ~/settings/foo/bar - это один и тот же файл?

Edit: D'oh, еще несколько минут поиска показали ответ: readlink -f $path

3 ответа3

16

Многие оболочки имеют оператор -ef для встроенного test (или его синоним [), чтобы проверить, указывают ли два пути на один и тот же существующий файл (по символическим ссылкам). Это включает в себя bash, dash, pdksh, ksh88, ksh93 и zsh, но не POSIX sh. В bash, ksh или zsh вы также можете использовать -ef в условной конструкции [[ … ]] .

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files
6

Если два файла имеют один и тот же deviceID и inode, это один и тот же файл. Инструмент командной строки stat упрощает поиск

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

это работает для файлов с символическими ссылками или файлов с жесткими ссылками.

0

Для программных ссылок (созданных с помощью ln -s) вы можете использовать realpath . Это не будет работать для жестких ссылок, хотя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .