我在一些文本文件上运行一个小 bash 脚本:
find . -name "*.dat" -exec iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' {} --output={} \;
我的机器是 Ubuntu 14.04 LTS。
过了一会儿,我发现文件里的数据好像有一半消失了;只需在一行/单词的中间切断即可。这是神秘的signal 7
或核心转储(据我所知)。当文件太大时,问题就出现了。我的一些文件的大小大于 60kB,但iconv
最后变成了 30kB 左右。
对此我能做什么?这是一个错误吗?有解决方法吗?还有其他方便的方法来音译变音符号吗?
答案1
正如我的问题的评论中指出的,当满足两个条件时就会出现问题:
- 源文件和目标文件相同。
- 文件大于 32768 字节。
有两种解决方案:要么转换一个临时文件,然后自动替换源文件,要么使用recode
.
至于第一个解决方案,请参见示例。https://unix.stackexchange.com/a/10243/94483。对于sponge
,有一个关于 SO 的非常好的问题(https://stackoverflow.com/q/64860/362146)以及这里的答案:https://unix.stackexchange.com/a/19980/94483
我现在将使用iconv
asrecode
支持较少的字符集(而且我也未能使其运行):
FILELIST=$(find . -type f -name "*.dat")
for file in $FILELIST
do
iconv --from-code='UTF-8' --to-code='ASCII//TRANSLIT' "$file" | sponge "$file"
done
sponge
进行替换工作。来自于更多实用程序。