2014-06-25 36 views
0

我有大量包含非ASCII字符的文件,它们遍布整个文件系统。所以我一直在寻找一个批处理解决方案,但我遇到了一个问题:从多个文件中删除非ASCII字符递归

find . -name "*.yml" -print0 | while read -d $'\0' file; do tr -cd '\11\12\15\40-\176' < "$file" > "$file"; done 

这个命令应该正常工作,不会有是TR如果使用相同的输入-CD不工作问题,输出名称。你知道任何替代方案或我如何解决这个小问题?

得到它(不知道如果这看起来不错或糟糕):根据文件名

find . -name "*.yml" -print0 | while read -d $'\0' file; do cp "$file" "${file}.temp" && tr -cd '\11\12\15\40-\176' < "${file}.temp" > "$file" && rm "${file}.temp"; done 
+0

...使用临时文件(或变量)? –

+0

mhh,我该怎么做,并仍然可以使用一个命令行命令或它需要一个批处理文件? – user2693017

回答

1

你处理,你可能要添加IFS=-r到读命令,见Greg's BashFAQ 001详细信息。

关于您的问题,请使用Carl建议的临时文件或使用the moreutils package的海绵命令。因此,要么:

find . -name "*.yml" -print0 | 
while read -r -d '' file; do 
    tr -cd '\11\12\15\40-\176' < "$file" > "${file}.tmp" \ 
    && mv "${file}.tmp" "$file" 
done 

或:

find . -name "*.yml" -print0 | 
while read -r -d '' file; do 
    tr -cd '\11\12\15\40-\176' < "$file" | sponge "$file" 
done 
+0

我认为语法'tr ... < orig > tempfile && mv tempfile orig'有点让人放心 - 我的意思是'&&',它只会覆盖原来的修改,如果成功。 –

+0

@MarkSetchell:我同意,更新。谢谢。 – Thor