我在网络根目录中有一组文件,其中包含我想删除的特殊字符(Â,€,â等)。
我的命令
find . -type f -name '*.*' -exec grep -il "Â" {} \;
发现&列出文件就好了,但我的命令
find . -type f -name '*.*' -exec tr -d 'Â' '' \;
不会产生我正在寻找的结果。
有什么想法吗?
答案 0 :(得分:4)
替换您可以使用的当前目录中所有文件中的所有非ascii 字符:
find . -type f | xargs perl -pi.bak -e 's,[^[:ascii:]],,g'
之后你必须找到并删除所有'.bak'文件:
find . -type f -a -name \*.bak | xargs rm
答案 1 :(得分:3)
我建议调查sed。它可以用来替换文件的内容。
所以你可以使用命令:
find . -type f -name '*.*' -exec sed -i "s/Â//" {} \;
我用一个简单的例子对此进行了测试,似乎有效。 -exec
应该处理名称中带有空格的文件,但可能还有其他我不知道的漏洞。
答案 2 :(得分:2)
使用
tr -d 'Â'
''代表什么?在我的系统上使用您的命令会产生此错误:
tr:额外的操作数`'
删除时不能重复删除,只能给出一个字符串。
尝试`tr --help'获取更多信息。
答案 3 :(得分:1)
sed 's/ø//' file.txt
这应该是用空字符串替换特殊字符的技巧。
find . -name "*.*" -exec sed 's/ø//' {} \
答案 4 :(得分:0)
我会用这样的东西。
for file in `find . -type f`
do
# Search for char end remove it. Save file as file.new
sed -e 's/[ۉ]//g' $file > $file.new
# mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE
mv $file.new $file
done
上面的脚本会失败,因为levislevis85用文件名中的空格提到它。如果您使用以下代码,则不会出现这种情况。
find . -type f | while read file
do
# Search for char end remove it. Save file as file.new
sed -e 's/[ۉ]//g' "$file" > "$file".new
# mv file.new to file DON'T RUN IF YOU WILL NOT OVERITE ORIGINAL FILE
mv "$file".new "$file"
done
答案 5 :(得分:0)
知道什么“不能产生我正在寻找的结果”是有帮助的。但是,在您的命令tr
中未提供要处理的文件名。您可以将其更改为:
find . -type f -name '*.*' -exec tr -d 'Â' {} \;
将把所有内容输出到stdout。您可能希望修改文件。您可以使用 Grundlefleck 的答案,但该答案中提到的问题之一是文件是否有大量问题。你可以这样做:
find . -type f -name '*.*' -print0 | xargs -0 -I{} sed -i "s/Â//" \{\}
应处理名称中包含空格的文件以及大量文件。
答案 6 :(得分:0)
使用bash shell
for file in *.*
do
case "$file" in
*[^[:ascii:]]* )
mv "$file" "${file//[^[:ascii:]]/}"
;;
esac
done