При необходимости в другом поведении, разорвана ли связь или циклическая, можно также использовать %Y с находкой:
$ touch a
$ ln -s a b # link to existing target
$ ln -s c d # link to non-existing target
$ ln -s e e # link to itself
$ find . -type l -exec test ! -e {} \; -printf '%Y %p\n' \
| while read type link; do
case "$type" in
N) echo "do something with broken link $link" ;;
L) echo "do something with cyclic link $link" ;;
esac
done
do something with broken link ./d
do something with cyclic link ./e
Этот пример копируется с этого сообщения (удаленный сайт).
Ссылка
От man 7 regex
:
Выражение скобки является списком символов, включенных в" []". …
… Для включения литерала '-', делают он первый или последний знак …. ll другие специальные символы, включая' \', теряют их специальное значение в рамках выражения скобки.
Попытка regexp с egrep дает ошибку:
$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end
Вот более простая версия, которая также дает ошибку:
$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end
С тех пор \
не является особенным, который является диапазоном, точно так же, как [a-z]
был бы. Необходимо поместить Ваш -
в конце, как [_-]
или:
echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup
Это должно работать независимо от Вашей libc версии (или в egrep или в ударе).
править: Это на самом деле зависит от Ваших настроек локали также. Страница справочника действительно предупреждает об этом:
Диапазоны очень зависимы от сортирующей последовательности, и портативные программы должны постараться не полагаться на них.
Например:
$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_
Конечно, даже при том, что это не сделало ошибки, это не делает то, что Вы хотите:
$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_
Это - диапазон, который в ASCII, включает \
, [
, ^
, и _
.
Общее правило с regexps (и любые ошибки в больших частях кода): сократите его и восстановите его шаг за шагом или деление пополам использования - безотносительно работ лучше для Вас.
В этом случае преступник оказался подчеркиванием - выход, это с обратной косой чертой заставило его работать.
egrep
не дает ошибки, просто соответствия это правильно. – manatwork 03.10.2013, 18:35LC_COLLATE="en_US.UTF-8"
? – manatwork 03.10.2013, 18:40-
... так как исключением – derobert 03.10.2013, 18:44