使用find或grep来定位来自不同编码系统(Windows到Linux)的重音字符的文件名,

我试图拖延到一个类似于我的问题( 在Linux文件系统上查找非UTF8文件名 )来引发进一步的答复,迄今没有运气,所以这里再次…

我在上面的链接中遇到与OP相同的问题,convmv是修复自己的文件系统的好工具。 因此,我的问题是学术性的,但是我觉得它不能令人满意(实际上我不能相信)“找”不能find非标准的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看到)。 无论发生什么事情都不是我所期望的:既不find也不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应该find它,对吧? 但也许有一个我不知道的function?

任何见解将非常感激。

Jander 回答了我发布在Super User上的同一个问题

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

用LANG = C,查找显示带有问号的非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