Не вполне уместна задача для Bash.
Вариант 1: Я хотел бы использовать Java или Groovy, есть обработчик SAX просто сбросить все данные для вывода, для <a>
элементов, для которых он будет проверять значение href
за исключением, и если нарушена, добавьте class="broken"
часть.
Вариант 2: Имейте XSLT, который будет называть пользовательскую функцию XSLT на <a>
элементах. Опять же, я бы сделал это с Java, но любой язык с хорошим движком XSLT может это сделать.
Вариант 3: Если вы действительно хотите, чтобы чувствовать себя вызывающим ;-) вот линия, чтобы получить достаточно ненадежные проверки ссылок на Bash:
grep -R '(?:href="(http://[^"]+)")' -ohPI | grep -oP 'http://[^"]+' | sort | uniq | wget -nv -S -O /dev/null -i - 2>&1 | grep -P '(wget:| -> |HTTP/|Location:)'
Это, вероятно, может стать лучше, но Я был в порядке с этим.
- Вариант 4: Можно использовать
curl -L ...
(-L
следует редирект) вместо wget
.
grep -R '(?:"(http://[^"]+)")' -ohPI | grep -v search.maven.org | grep -oP 'http://[^"]+' | sort | uniq | xargs -I{} sh -c 'echo && echo "$1" && curl -i -I -L -m 5 -s -S "$1"' -- {} 2>&1 | grep -P '(^$|curl:|HTTP/|http://|https://|Location:)'
Pro совет: curl
кажется, больше сценариев дружественного выхода, так что вы можете сделать это параллельно ускорить: ... | xargs -n 1 -P 8 curl -L ...
Это будет работать 8 процессов curl
и передать один аргумент (URL) вовремя. Сортировка вывода зависит от вас, я бы, вероятно, создавал один файл для каждого вызова curl
, а затем конкатенировал.
Комбинация 'grep' и' wget', я бы себе представлял. –
Вам понадобится некоторый RegEx, чтобы извлечь часть href = "...", затем перейдите к, затем замените классом = сломанным. Я думаю, что даже если бы Бэш мог это сделать, это было бы не очень здорово. Если это просто игра, все в порядке, в противном случае я бы пошел с другим языком –
Raffaele
, если ниже ссылки помогут вам ... http://giantdorks.org/alain/little-shell-script-to-recursive-check- a-site-for-broken-links/ http://tldp.org/LDP/abs/html/writingscripts.html –