gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:23:09 29 4
gpt4 key购买 nike

我试图在一个类似于我的问题 ( 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 看到)。无论这里发生什么,都不是我所期望的: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 应该能找到它,对吧?但也许有一个我不知道的功能?

如有任何见解,我们将不胜感激。

最佳答案

詹德 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

关于regex - 使用 find 或 grep 查找来自不同编码系统(Windows 到 Linux)的带有重音字符的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360151/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com