На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
RazorJack
Сообщения: 113
ОС: Gentoo 2008
Сообщение
RazorJack » 16.11.2009 09:42
собсно в сабже весь вопрос. желательно подсказать команду которая это делает
решение типа
не катит потому что в пути к файлу могут встречатся такие вот чтуки "/./../catalog_a/catalog_b/../../catalog_a" ну вобщем поняли о чем я говорю
Возможно есть программа которая чистит путь к файлу от подобных выкрутасов тогда можно будет сравнивать строки напрямую
Спасибо
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 16.11.2009 09:54
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
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
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 {} \;
вроде работает...
/dev/random
Администратор
Сообщения: 5447
ОС: Gentoo
Сообщение
/dev/random » 16.11.2009 12:34
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
Сообщение
RazorJack » 16.11.2009 15:26
Да не парни.
мне не надо удалять битые симлинки в том то и дело что симлинк нормальный мне надо определить на какой файл из списка ссылается этот симлинк
А можно и регулярным выражением (sed).
ну удалить седом такие вещи как "/./" не проблема конечно а вот как быть с "hello/../hello" ? ( хотя конечно можно поднапрячся и сделать регексп который удаляет имя каталога следующее перед /../ вместе с ней самой ) но я расчитывал на коропульку - программку которая за меня все сделает ну ладно наверно правда sed ом придется
RazorJack
Сообщения: 113
ОС: Gentoo 2008
Сообщение
RazorJack » 16.11.2009 15:47
Код: Выделить всё
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
Сообщение
drBatty » 16.11.2009 16:31
RazorJack писал(а): ↑ 16.11.2009 15:47
sed -e "s/\/[^/]*\/\.\.\//\//g"
во первых -e не обязательно если sed-скрипт один и первый, во вторых, можно писать так:
ЗЫЖ а это всё работает?
ЗЗЫЖ ИМХО такие симлинки лучше не делать.
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Сообщение
diesel » 16.11.2009 16:45
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:~$
это два способа получить файл на который ссылается симлинк. его можно засунуть в переменную, типа
и что-то типа:
Код: Выделить всё
grep -F "$link_to" list_of_links[
или
grep -F "$(readlink -f test-link)" list_of_links
зависит от формата списка.
i Уведомление от модератора diesel
перенес тему в "Работу в командной строке"
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 17.11.2009 11:25
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
Сообщение
drBatty » 17.11.2009 14:36
t.t писал(а): ↑ 17.11.2009 11:25
Конечно есть -- realpath:
а где её брать? я нашёл только для php и в составе jre.
RazorJack
Сообщения: 113
ОС: Gentoo 2008
Сообщение
RazorJack » 17.11.2009 14:57
Код: Выделить всё
а где её брать? я нашёл только для php и в составе jre.
В портах она есть точно (gentoo)
спасибо за подсказку
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 17.11.2009 19:05
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
Сообщение
drBatty » 17.11.2009 20:42
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 22.11.2009 16:08
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
оно.
RazorJack
Сообщения: 113
ОС: Gentoo 2008
Сообщение
RazorJack » 23.11.2009 12:47
Сравнивать иноды - это круто придумано так и сделаем
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Сообщение
sash-kan » 25.11.2009 22:16
(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