Як перевірити, чи існує URL-адреса із оболонкою та, можливо, згортається?


79

Я шукаю просту перевірку оболонки (+ curl), яка оцінила б як істинне чи хибне, якщо URL-адреса існує (повертає 200) чи ні.

Відповіді:


132

Використання --failзробить статус виходу ненульовим при невдалому запиті. Використання --headдозволить уникнути завантаження вмісту файлу, оскільки він нам не потрібен для цієї перевірки. Використання --silentдозволить уникнути випуску стану або помилок самою перевіркою.

if curl --output /dev/null --silent --head --fail "$url"; then
  echo "URL exists: $url"
else
  echo "URL does not exist: $url"
fi

Якщо ваш сервер відхиляє запити HEAD, альтернативою є запит лише на перший байт файлу:

if curl --output /dev/null --silent --fail -r 0-0 "$url"; then

4
Включити -o /dev/nullдля придушення друку заголовка на stdout
Шон Чін

3
Додайте --location, щоб слідкувати за переспрямуваннями та повідомляти про існування URL-адреси переспрямування замість початкової URL-адреси
Іван Козік

1
схоже, це рішення не працює для тимчасового переїзду у випадку 302 навіть із використанням -L або --location. Приклад: github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
Нам Нгуєн

2
@NamNguyen, ... цікаво вирішити цю проблему витончено - один із підходів полягає у використанні -r 0-0запиту лише першого байта файлу. Я відповідно змінив відповідь.
Чарльз Даффі,

2
@NamNguyen Я також настійно рекомендую return 0і return 1для truthiness і falsiness, а не використовувати стандартний висновок для повернення trueі falseяк рядки. Таким чином, хтось може запустити:, if existURL "$url"без зайвих (неефективних) накладних витрат на спроби захопити його stdout і інтерпретувати те саме.
Чарльз Даффі,

34

Я вважаю, що wget є кращим інструментом для цього, ніж CURL; є менше варіантів, які слід запам’ятати, і ви насправді можете перевірити на істинність значення в bash, щоб побачити, чи вдалося це за замовчуванням.

if wget --spider http://google.com 2>/dev/null; then
  echo "File exists"
else
  echo "File does not exist"
fi

В --spiderопції робить Wget просто перевірити на файл , а не завантажуючи його, і 2> /dev/nullзамовчування Wget'S STDERR вихід.


"Насправді можна перевірити його істинність у bash" не є унікальним для wget; за допомогою --failцього можна зробити те ж саме з завиванням.
Чарльз Даффі,

3
Тому я сказав "за замовчуванням". Спробуйте запустити wget google.com/asdfі curl google.com/asdf. curlповертає EXIT_SUCCESS за замовчуванням при виникненні помилки 404, тоді як wgetповертає EXIT_FAILURE.
ailnlv

Це дійсно повільно. Я перевіряю сайт, на якому є файли для завантаження в сумі 1 Гб, але я не хочу їх завантажувати, просто перевірте, чи існують цілі
rubo77

1
Ось для чого --spiderаргумент: він wgetповертається після перевірки існування файлу, а не завантаження.
ailnlv

У мене проблема з цим на github: wget --spider github.com/linuxwacom/libwacom/releases/download/libwacom-1.6/… Призводить до 403 ЗАБОРОНЕНО і повідомлення "Віддалений файл не існує - непрацююче посилання !!! ". Це мені знадобилося для сценарію, щоб перевірити, чи існує віддалена URL-адреса, для автоматичного оновлення програм. (Цікаво, що без прапора --spider, wget просто завантажує файл без проблем. Це дивно ...)
shevy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.