Перевірте, чи два шляхи вказують на один і той же файл


12

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

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

, як я можу перевірити, що ~ / foo / bar та ~ / settings / foo / bar є одним файлом?

Редагувати : D'oh, ще кілька хвилин пошуку виявили відповідь :readlink -f $path

Відповіді:


6

Якщо два файли мають однаковіID пристрою та inode, вони є тим самим файлом. Інструмент statкомандного рядка робить це легко знайти

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

...

це працює для файлів з посиланням або файлів з твердим посиланням.


5
Щоб перейти до символічних посилань, вам потрібно stat -L.
Жил "ТАК - перестань бути злим"

Як сказав @Gilles, без перемикача -L ви можете отримати неправильні результати на деяких дистрибутивах
Olaseni

19

Багато оболонок мають -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

1
Згідно з моєю сторінкою, -ef робить точно те саме, що відповідь Річки Гомолки.
user13852

2
@ user13852 -efмає перевагу в тому, що він більш портативний (також трохи швидше, але не так, щоб ви помітили більшу частину часу). Наприклад, він працює на * BSD, OSX, BusyBox, а також Linux / Cygwin (GNU). Це також зрозуміліше, оскільки він робить саме те, що потрібно. Єдина перевага, яку я можу побачити, - statце те, коли ви не хочете слідувати символьним посиланням.
Жил "ТАК - перестань бути злим"

0

Для програмних посилань (створених за допомогою ln -s) ви можете використовувати realpath. Це не працює для жорстких посилань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.