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

Linux 从多个递归文件中删除非ASCII字符,linux,command-line,find,batch-processing,tr,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 find-在读取-d$'\0'文件时命名为“*.yml”-print0 |;做tr-cd'\11\12\15\40-\176'“$file”;完成

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

find . -name "*.yml" -print0 | while read -d $'\0' file; do tr -cd '\11\12\15\40-\176' < "$file" > "$file"; done
find-在读取-d$'\0'文件时命名为“*.yml”-print0 |;做tr-cd'\11\12\15\40-\176'<“$file”>“$file”;完成
这个命令应该可以正常工作,如果您使用相同的输入和输出名称,那么tr-cd不会出现问题吗。你知道我有什么办法可以解决这个小问题吗

明白了(不知道是好看还是不好看):

find-在读取-d$'\0'文件时命名为“*.yml”-print0 |;执行cp“$file”${file}.temp”和&tr-cd“\11\12\15\40-\176”<“${file}.temp”>“$file”和&rm“${file}.temp”;完成

根据正在处理的文件名,您可能需要将
IFS=
-r
添加到read命令中,有关详细信息,请参阅

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

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-名称“*.yml”-print0|
读取-r-d“”文件时;做
tr-cd'\11\12\15\40-\176'<“$file”>“${file}.tmp”\
&&mv“${file}.tmp”“$file”
完成
或:

find-名称“*.yml”-print0|
读取-r-d“”文件时;做
tr-cd'\11\12\15\40-\176'<“$file”|海绵“$file”
完成

。。。使用一个临时文件(或变量)?嗯,我该怎么做?它是否仍然可以与一个命令行命令一起使用,还是需要一个批处理文件?我认为语法
tr…tempfile&&mv tempfile orig
更让人放心一点——我指的是
&
,如果成功,它只会用修改后的文件覆盖原始文件。
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