从递归的多个文件中删除非ASCII字符

时间:2014-06-25 23:16:08

标签: linux command-line find batch-processing tr

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

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

此命令应该可以正常工作,如果您使用相同的输入和输出名称,则不存在tr -cd不起作用的问题。您知道任何替代方案或如何解决这个小问题吗?

GOT IT(不知道这看起来好看还是糟糕):

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

1 个答案:

答案 0 :(得分:1)

根据您正在处理的文件名,您可能希望将IFS=-r添加到读取命令,有关详细信息,请参阅Greg's BashFAQ 001

关于您的问题,请使用Carl建议的临时文件或使用the moreutils package中的sponge命令。所以:

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