Горячий для осуществления различной проверки сама ссылка символьной ссылки?

Один способ использовать awk:

awk 'NR==FNR{a[$0];next}f;($0 in a){f=1}'  file2 file1

где file2 содержит Ваши шаблоны поиска. Во-первых, все содержание file2 хранится в массиве "a". Когда file1 обрабатывается, каждая строка проверяется по массиву и печатается, только если не присутствует.

8
12.11.2013, 01:51
4 ответа

С инструментами GNU:

diff <(cd dir1 && find . -type l -printf '%p -> %l\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p -> %l\n'|sort)

Строго говоря это не может дифференцироваться между названной символьной ссылкой a это указывает на b -> c и один названный a -> b это указывает на c, не говоря уже о проблемах с именами файлов, содержащими символы новой строки, но это делает для более четкого вывода, чем более устойчивое:

diff <(cd dir1 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort)

Там, мы используем // как разделитель (который не может произойти иначе в выводе find для %p) и преобразуйте символы новой строки в символы NUL (который не может произойти в расширении %p ни %l).

1
27.01.2020, 20:11

Если я понимаю правильно, Вы хотите проверить, что символьные ссылки указывают тому же теоретическому месту назначения или этому, если Вы не символьная ссылка, другие ссылки файла на тот же файл. Это должно сделать то, что Вы хотите:

#!/bin/bash

if [[ "$(readlink -m -- "$1")" == "$(readlink -m -- "$2")" ]]; then
    echo "files match"
else
    echo "files don't match"
    exit 1
fi
$ > foo 
$ ln -s foo bar
$ ln -s foo baz
$ ./script bar baz
files match
$ ./script bar foo
files match
$ ln -sf qux bar
$ ./script bar foo
files don't match
1
27.01.2020, 20:11
  • 1
    @StephaneChazelas Это - моя ошибка, я означал использовать -m, нет -f.Спасибо! –  Chris Down 11.11.2013, 13:19
  • 2
    Строго говоря это не работало бы, если единственной разницей является количество запаздывающих символов новой строки в целях символьных ссылок. –  Stéphane Chazelas 11.11.2013, 13:26
  • 3
    я не использовал бы -m также. –  Stéphane Chazelas 11.11.2013, 13:28
  • 4
    @StephaneChazelas, По какой причине? Без него относительные символьные ссылки, которые действительно указывают на тот же файл, приведут это сравнение к сбою. –  Chris Down 11.11.2013, 13:29
  • 5
    Если /home/test/file1 символьная ссылка на /etc/rc.d/whatever, или они - оба символьная ссылка на /, это сообщило бы, что они - то же. Я думаю, что OP хочет видеть различие в "пути", сохраненном в символьной ссылке, не, решают ли они в тот же файл (для которого Вы имеете [[ a -ef b ]]). –  Stéphane Chazelas 11.11.2013, 13:32

Попробуйте GNU diff версии 3.3 или более поздней с опцией - без ссылок (и, предположительно, с опцией - рекурсивной):

diff --recursive --no-dereference tree1root tree2root
6
27.01.2020, 20:11
121 --- 133695-

С версии 3.3 GNU Diff поддерживает не развесел симличия, но затем сравнивает пути, которые они указывают.

Установите GNU Diffulls> = 3.3 и используйте опцию «--NO-dereence»; Для этого нет короткого варианта.

Диагностика будет молчать, если пути равны или:

Symbolic links /tmp/noderef/a/symlink and /tmp/noderef/b/symlink differ

, если пути отличаются.

3
27.01.2020, 20:11

Теги

Похожие вопросы