使用find或grep从不同的编码系统中查找带有重音字符的文件名(Windows到Linux)

时间:2010-12-05 17:33:04

标签: regex linux find grep

我试着用类似于我的问题(Find Non-UTF8 Filenames on Linux File System)进行标记,以便得到进一步的回复,到目前为止没有运气,所以这里又一次......

我遇到与上面链接中的OP相同的问题,而convmv是修复自己的文件系统的好工具。因此,我的问题是学术性的,但我发现“发现”找不到非标准的ascii字符是不能令人满意的(事实上我无法相信)。

有没有人会知道用什么组合的选项来查找包含非标准字符的文件名似乎是unicode FS,在我的例子中,字符似乎是8位扩展ascii而不是unicode,文件来自Windows机器(iso-8859-1),我经常需要获取它们。我很想知道find和/或grep如何与convmv一样。

示例文件:

> ls
Abc�def ÉÈéèáà-rest everest éverest

> ls -b
Abc\251def  ÉÈéèáà-rest  everest  éverest

第一个文件来自Windows(或使用touch $(printf "Abc\xA9def")进行模拟)。

> find . -regex '.*[^a-zA-Z./].*'
./ÉÈéèáà-rest

> ls | egrep '[^a-zA-Z]'
ÉÈéèáà-rest

几乎缺少所有这些(连字符保存了该文件,可以看到彩色grep)。无论发生什么事情都不是我所期望的:找不到也没有grep能够把重音字母作为超出提供的范围[^ a-zA-Z ./].

> find . -regex '.*é.*'
./éverest
./ÉÈéèáà-rest

> ls | egrep 'é'
ÉÈéèáà-rest
éverest

> ls | egrep '[é]'
ÉÈéèáà-rest
éverest

> find . -regex '.*[é].*'
./éverest
./ÉÈéèáà-rest

在提供时(包括在范围内),两者都能够获得标准口音。任何使用\ xA9,\ 0251或\ o251的查找或grep试验都会失败(不匹配)。

> ls | fgrep e
Abc�def
ÉÈéèáà-rest
everest
éverest

寻找一个没有争议的角色会显示所有带有grep的文件,正如我所期望的那样。

> find . -regex '.*e.*'
./éverest
./ÉÈéèáà-rest
./everest

> find . -name '*e*'
./éverest
./ÉÈéèáà-rest
./everest
然而,

发现是非常具有歧视性的:即使查找正常字符,在我看来,它消除了包含文件系统名称编码模式的可接受字符范围之外的字符的文件名。

据我所知,如果文件在文件系统中,那么find应该找到它,对吧?但也许有一个我不知道的功能?

非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

Jander answered to the same question I posted on Super User

Jander的回答完美地完成了这项工作,对于那些有兴趣从中获得更多收益的人来说,这里还有一个提示。

使用LANG = C,find会显示带有问号的非ascii字符。要使用该文件系统将其转换回正常显示,只需将输出传递给cat。

LANG=C find . -regex '.*[^a-zA-Z./-].*'
./??verest
./????????????-rest
./Abc?def

LANG=C find . -regex '.*[^a-zA-Z./-].*' | cat
./éverest
./ÉÈéèáà-rest
./Abc�def