РЕШЕНО проверка симлика (ссылается вот этот симлинк на вот этот файл)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
RazorJack
Сообщения: 113
ОС: Gentoo 2008

РЕШЕНО проверка симлика

Сообщение RazorJack »

собсно в сабже весь вопрос. желательно подсказать команду которая это делает
решение типа

Код: Выделить всё

file ${symlinkname} | grep -e ${filename}

не катит потому что в пути к файлу могут встречатся такие вот чтуки "/./../catalog_a/catalog_b/../../catalog_a" ну вобщем поняли о чем я говорю
Возможно есть программа которая чистит путь к файлу от подобных выкрутасов тогда можно будет сравнивать строки напрямую
Спасибо
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: РЕШЕНО проверка симлика

Сообщение drBatty »

RazorJack писал(а):
16.11.2009 09:42
не катит потому что в пути к файлу могут встречатся такие вот чтуки

катит. утилита file прекрасно распутывает такие симлинки.
$ file /usr/bin/zless
/usr/bin/zless: symbolic link to `../../bin/zless'

PS: на счёт "программы очистки", есть
$ basename /usr/bin/zless
zless

А можно и регулярным выражением (sed).

PPS: да, вот это забыл рассказать:
$ readlink zless
../../bin/zless
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: РЕШЕНО проверка симлика

Сообщение drBatty »

да, вот скрипт для удаления битых ссылок:

Код: Выделить всё

#!/bin/bash

if `file $1 | grep -q "broken symbolic link"`; then
    #битая ссылка
    rm -i $1
fi

#find / -type l -exec ls -l --color {} \; -exec /home/doc/rm_dead_links {} \;

вроде работает...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5447
ОС: Gentoo

Re: РЕШЕНО проверка симлика

Сообщение /dev/random »

drBatty писал(а):
16.11.2009 10:03
да, вот скрипт для удаления битых ссылок:

Код: Выделить всё

#!/bin/bash

if `file $1 | grep -q "broken symbolic link"`; then
    #битая ссылка
    rm -i $1
fi

#find / -type l -exec ls -l --color {} \; -exec /home/doc/rm_dead_links {} \;

вроде работает...

Можно проще.
find -L / -type l -exec rm -i {} \;
Внимательно прочитайте описание опции -L в man find.
Спасибо сказали:
Аватара пользователя
RazorJack
Сообщения: 113
ОС: Gentoo 2008

Re: РЕШЕНО проверка симлика

Сообщение RazorJack »

Да не парни.
мне не надо удалять битые симлинки в том то и дело что симлинк нормальный мне надо определить на какой файл из списка ссылается этот симлинк
А можно и регулярным выражением (sed).


ну удалить седом такие вещи как "/./" не проблема конечно а вот как быть с "hello/../hello" ? ( хотя конечно можно поднапрячся и сделать регексп который удаляет имя каталога следующее перед /../ вместе с ней самой ) но я расчитывал на коропульку - программку которая за меня все сделает ну ладно наверно правда sed ом придется
Спасибо сказали:
Аватара пользователя
RazorJack
Сообщения: 113
ОС: Gentoo 2008

Re: РЕШЕНО проверка симлика

Сообщение RazorJack »

Код: Выделить всё

aaa="kill/./././../me/./../me/../now"
while echo "${aaa}" | grep -e "\/\.\/" || echo "${aaa}" | grep -e "\/\.\.\/";do
   aaa=$(echo "${aaa}" | sed -e "s/\/\.\//\//g" | sed -e "s/\/[^/]*\/\.\.\//\//g")
done

мдя ...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: РЕШЕНО проверка симлика

Сообщение drBatty »

RazorJack писал(а):
16.11.2009 15:47
sed -e "s/\/[^/]*\/\.\.\//\//g"

во первых -e не обязательно если sed-скрипт один и первый, во вторых, можно писать так:

Код: Выделить всё

sed 's%/[^/]*/\.\./%/%g'


ЗЫЖ а это всё работает? ;)
ЗЗЫЖ ИМХО такие симлинки лучше не делать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: РЕШЕНО проверка симлика

Сообщение diesel »

RazorJack писал(а):
16.11.2009 15:26
Да не парни.
мне не надо удалять битые симлинки в том то и дело что симлинк нормальный мне надо определить на какой файл из списка ссылается этот симлинк

Код: Выделить всё

vasiliy@eifel:~$ ln -s /bin test-link
vasiliy@eifel:~$ ls -ld test-link
lrwxrwxrwx 1 vasiliy 4 2009-11-16 15:32 test-link -> /bin
vasiliy@eifel:~$ ls -ld test-link | awk -F'->' '{print $NF}'
 /bin
vasiliy@eifel:~$ ls -ld test-link | awk -F'-> ' '{print $NF}'
/bin
vasiliy@eifel:~$ readlink -f test-link
/bin
vasiliy@eifel:~$


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

Код: Выделить всё

link_to=$(readlink -f test-link)

и что-то типа:

Код: Выделить всё

grep -F "$link_to" list_of_links[
или
grep -F "$(readlink -f test-link)" list_of_links

зависит от формата списка.

iУведомление от модератора diesel

перенес тему в "Работу в командной строке"
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: РЕШЕНО проверка симлика

Сообщение t.t »

RazorJack писал(а):
16.11.2009 09:42
в пути к файлу могут встречатся такие вот чтуки "/./../catalog_a/catalog_b/../../catalog_a" ну вобщем поняли о чем я говорю
Возможно есть программа которая чистит путь к файлу от подобных выкрутасов
Конечно есть -- realpath:

Shell

t:~$ realpath ../t/./htdocs//../src/mpd-pb/ /home/t/src/mpd-pb


По умолчанию она и символические ссылки "разрешает", кстати.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: РЕШЕНО проверка симлика

Сообщение drBatty »

t.t писал(а):
17.11.2009 11:25
Конечно есть -- realpath:

а где её брать? я нашёл только для php и в составе jre.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
RazorJack
Сообщения: 113
ОС: Gentoo 2008

Re: РЕШЕНО проверка симлика

Сообщение RazorJack »

Код: Выделить всё

а где её брать? я нашёл только для php и в составе jre.

В портах она есть точно (gentoo)
спасибо за подсказку
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: РЕШЕНО проверка симлика

Сообщение t.t »

drBatty писал(а):
17.11.2009 14:36
t.t писал(а):
17.11.2009 11:25
Конечно есть -- realpath:
а где её брать? я нашёл только для php и в составе jre.
В Debian это отдельный пакет.
Цитирую ман:

Код: Выделить всё

AUTHOR
       Lars Wirzenius <liw@iki.fi>, as part of the dwww package.
       Modified by Robert Luberda <robert@debian.org>.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: РЕШЕНО проверка симлика

Сообщение drBatty »

собрал
взял здесь: http://packages.debian.org/source/stable/realpath
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: РЕШЕНО проверка симлика

Сообщение sash-kan »

RazorJack писал(а):
16.11.2009 15:26
мне надо определить на какой файл из списка ссылается этот симлинк
логичнее и проще будет inode-ы сравнивать:

вот symlink:
$ ls -l /vmlinuz
lrwxrwxrwx 1 root root 27 2009-04-18 01:22 /vmlinuz -> boot/vmlinuz-2.6.26-2-amd64

это inode самого symlink-а
$ ls -i /vmlinuz
48654 /vmlinuz

а это inode того, на что он ссылается.
$ ls -iH /vmlinuz
112910 /vmlinuz

проверяем:
$ ls -i /boot/vmlinuz-2.6.26-2-amd64
112910 /boot/vmlinuz-2.6.26-2-amd64

оно.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
RazorJack
Сообщения: 113
ОС: Gentoo 2008

Re: РЕШЕНО проверка симлика

Сообщение RazorJack »

Сравнивать иноды - это круто придумано так и сделаем
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: РЕШЕНО проверка симлика

Сообщение sash-kan »

(man bash) писал(а):file1 -ef file2
True if file1 and file2 refer to the same device and inode numbers.

$ [ /vmlinuz -ef /boot/vmlinuz-2.6.26-2-amd64 ] && echo da || echo net
da
$ [ /vmlinuz -ef /boot/config-2.6.26-2-amd64 ] && echo da || echo net
net
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: