目前我正在處理一堆舊檔案,這些檔案在它們的生命周期中已經見過很多機器、作業系統和檔案系統。其中一些包含德語變音符號(?、?、ü),顯然這些已經導致某些檔案名在一個移動程序中中斷。最初命名的檔案
München.txt
顯示為
M?nchen.txt (invalid encoding)
在當前托管它們的 ubuntu 系統上。
所以現在我正在嘗試批量修復它們。在遍歷帶有初稿的檔案時,我偶然發現了這種現象:
回顯到螢屏上給我帶問號的檔案名,我理解這是檔案名中非法字符解釋的標志:
./list_files.sh path_to_files M?nchen.txt K?ln.txt但是,如果我將輸出保存到檔案中,它會給我一個仍然包含無效字符的二進制檔案:
./list_files.sh path_to_files > file_list less file_list M<FC>nchen.txt K<F6>ln.txt
這是代碼:
#!/bin/bash
rootdir=$1
find "$rootdir" -print0 | while IFS= read -r -d '' broken_file_name; do
echo $broken_file_name
done
我試圖理解:
- 為什么螢屏輸出與檔案中的不同?字符替換在哪里發生,問號的東西在哪里創建?
- 如何防止在腳本行程中用問號來解釋非法字符?它阻止我有選擇地用相應的正確字符替換非法字符。
uj5u.com熱心網友回復:
問號替換可能發生在 Bash 本身,只要您使用 Bashecho并嘗試輸出無法在當前語言環境中表示的字符。它也可能是終端驅動程式的一個功能。
我們只能推測原始編碼,但癥狀與Latin-1(ISO-8859-1)一致。
假設我猜對了編碼,并假設您當前的語言環境是 UTF-8,請嘗試類似
while IFS= read -r original; do
dest=$(iconv -f iso-8859-1 <<<"$original")
mv -- "$original" "$dest"
done <file_list
uj5u.com熱心網友回復:
與的不同行為less可能是less一回事。從手冊:
控制和二進制字符以突出顯示(反向視頻)。如果可能,每個這樣的字符都以插入符號顯示(例如 ^A 表示 control-A)。僅當反轉 0100 位導致正常的可列印字符時才使用插入符號。否則,該字符在尖括號中顯示為十六進制數字。可以通過設定 LESSBINFMT 環境變數來更改此格式。
但是由于您想要的是重命名檔案,因此各種實用程式顯示名稱的方式并不那么重要。在您的腳本中,您可以使用,例如,tr通過替換其他人不喜歡的字符來計算新名稱。例如,如果您想分別用 o 和 u 替換 ? 和 ü:
new=$(tr '\366\374' 'ou' <<< "$old")
if [ "$new" != "$old" ]; then
mv "$old" "$new"
fi
(366 和 374 是 ? 和 ü 的 ASCII 碼,以八進制表示)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/370498.html
