diff --git a/tools/migrate-wiki.sh b/tools/migrate-wiki.sh index 1151d01..7f19f49 100755 --- a/tools/migrate-wiki.sh +++ b/tools/migrate-wiki.sh @@ -66,15 +66,21 @@ while [ "$#" -gt 0 ]; do esac done -old_hash() { # 舊演算法:SHA-1 前 8 碼大寫;首碼落在 0-9ABC 就改成 H 加前 7 碼 +old_hash() { # 舊演算法:一個候選鍵可能對到兩種舊頁名,兩種都印出來,一行一個 + # 這裡刻意印兩種,因為頁名規則改過兩次,兩代的頁至今並存: + # 第一代 只取 SHA-1 前 8 碼大寫。 + # 第二代 在第一代之上,首碼落在 0-9ABC 就改成 H 加前 7 碼。 + # 只算第二代的話,第一代那些首碼落在 0-9ABC 的頁一律配不到,會被誤判成孤兒 + # 留在原地。實例:同一個鍵在第一代是 1C516D85、第二代是 H1C516D8,兩張頁都在。 + # 首碼落在 D、E、F 的鍵兩代同值,這時只印一行。 if command -v sha1sum >/dev/null 2>&1; then raw=$(printf '%s' "$1" | sha1sum | awk '{print $1}') else raw=$(printf '%s' "$1" | shasum -a 1 | awk '{print $1}') fi h=$(printf '%s' "$raw" | cut -c1-8 | tr a-f A-F) - case "$h" in [0-9ABC]*) h="H$(printf '%s' "$h" | cut -c1-7)" ;; esac printf '%s\n' "$h" + case "$h" in [0-9ABC]*) printf 'H%s\n' "$(printf '%s' "$h" | cut -c1-7)" ;; esac } rc=0 @@ -218,7 +224,10 @@ sort -u "$work/keys" > "$work/keys.uniq" : > "$work/hashes" while IFS= read -r k <&3; do [ -n "$k" ] || continue - printf '%s\t%s\n' "$(old_hash "$k")" "$k" >> "$work/hashes" + # old_hash 一個鍵可能印兩行(兩代頁名規則),每一行都要能配得到同一個鍵 + old_hash "$k" | while IFS= read -r h; do + printf '%s\t%s\n' "$h" "$k" >> "$work/hashes" + done done 3< "$work/keys.uniq" # ---- 第三輪:正推配對 ----