iT邦幫忙

0

請問 find 如何判斷成功或失敗再去執行內文編碼轉換(Big5 -> UTF-8)?

afgn 2011-12-27 10:06:395107 瀏覽

如題。

我遇到的問題是我使用下列一行指令去做內文轉碼(Big5 -> UTF-8),但會遇到失敗 >"<

cd /www
find . -type f -name '*.php' -exec iconv -f BIG-5 -t UTF-8 {} -o {}.result \; -exec mv {} {}.bak \; -exec mv {}.result {} \; -exec rm -rf {}.bak \;

錯誤訊息如下:
中文 => iconv: 位置 22 有不合法的序列
英文 => iconv: illegal input sequence at position 22

經爬文查出是如果編碼已經不是 Big5,就會出現錯誤。當然下場是會轉失敗,而且把原來好的檔案刪掉 :(

想請教一下,有沒有什麼好方法可以加上判斷式,如同用 Shell Script 的語法加上 if then else 或是 判斷有輸出 2> 的錯誤就跳過執行 iconv 轉換的動作,或是任何可以手動判斷的方法,因為現在不知如何判斷內文的編碼究竟是 Big5 或是已轉換過的UTF-8,所以無從過濾起,麻煩大家了!

1 個回答

8
wiseguy
iT邦超人 1 級 ‧ 2011-12-27 14:24:15
最佳解答

利用 iconv 轉換錯誤會 return 邏輯 false 來決定要不要覆蓋原檔就好了。

find /www -type f -name '*.php' -exec bash -c 'iconv -f BIG-5
-t UTF-8 {} -o /dev/shm/b2u.result && mv -f /dev/shm/b2u.result {}' \;

afgn iT邦新手 5 級 ‧ 2011-12-27 16:13:14 檢舉

wiseguy提到:
find /www -type f -name '*.php' -exec bash -c 'iconv -f BIG-5
-t UTF-8 {} -o /dev/shm/b2u.result && mv -f /dev/shm/b2u.result {}' \;

RUN 起來應該OK ^_^

只可惜還是會出現錯誤訊息:
iconv: 緩衝區結尾有不完全的字元或 shift sequence
iconv: 位置 707 有不合法的輸入序列
iconv: 位置 3792 有不合法的輸入序列
iconv: 位置 557 有不合法的輸入序列
iconv: 位置 480 有不合法的輸入序列

但還是很感謝... 一直以為要用 shell script 才能做的事,怎麼 find 一行就能搞定?! 真是太神奇了 ^_^

wiseguy iT邦超人 1 級 ‧ 2011-12-27 23:11:01 檢舉

我故意沒抑制掉錯誤訊息,只是提醒你有些檔案是會轉換錯誤的。
不過有沒有顯示錯誤訊息並不影響執行結果。能轉的就會轉,不能轉的還是不能轉。
如果非得眼不見為淨,那在最後加一個 2>/dev/null 就好了。

我要發表回答

立即登入回答