fixlinks.sh (1408B)
1 #!/bin/sh 2 3 HEAD() { url=${1:?} 4 curl --connect-timeout 10 --insecure -sIL "$url" 5 } 6 7 resolve() { url=${1:?} 8 HEAD "$url" \ 9 | awk -v url="$url" ' 10 { gsub("\r", "") } 11 tolower($1) == "location:" { url=$2 } 12 $1 ~ "^HTTP/" && $2 == "200" { print url; exit } 13 ' 14 } 15 16 sed_escape_left() { exp=${1:?} 17 echo "$exp" | sed 's/[^^]/[&]/g; s/\^/\\^/' 18 } 19 20 sed_escape_right() { exp=${1:?} 21 echo "$exp" | sed 's/[&/]/\\&/g' 22 } 23 24 fix_url() { file=${1:?} url=${2:?} 25 new=$(resolve "$url") 26 27 if [ -z "$new" ]; then 28 echo "$url" 29 return 0 30 fi 31 32 if [ "$url" = "$new" ]; then 33 return 0 34 fi 35 36 old=$(sed_escape_left "$url") 37 new=$(sed_escape_right "$new") 38 sed -i "s/$old/$new/" "$file" 39 } 40 41 http_to_https() { file=${1:?} url=${2:?} 42 case "$url" in 43 (http://*) 44 old=$(sed_escape_left "$url") 45 new=$(sed_escape_right "https://${url#http://}") 46 sed -i "s/$old/$new/" "$file" 47 ;; 48 esac 49 } 50 51 https_to_http() { file=${1:?} url=${2:?} 52 case "$url" in 53 (https://*) 54 if ! HEAD "$url" >/dev/null; then 55 old=$(sed_escape_left "$url") 56 new=$(sed_escape_right "http://${url#https://}") 57 sed -i "s/$old/$new/" "$file" 58 fi 59 ;; 60 esac 61 } 62 63 fix_file() { file=${1:?} 64 ./md-printlinks <"$file" \ 65 | grep // \ 66 | sed 's,^//,https://,' \ 67 | while read url; do 68 case url in (*bell-labs*) continue ;; esac 69 http_to_https "$file" "$url" 70 https_to_http "$file" "$url" 71 fix_url "$file" "$url" 72 done 73 } 74 75 for file in "$@"; do 76 fix_file "$file" 77 done