我有大量包含非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
答案 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