2015-11-07 45 views
0

我有使用与OSX 10.11控制台命令对应的通配符路径(但我想这将是对Linux的类似)在bash的通配符路径使用UTF-8字符的命令

我有事件和日期命名的文件夹的结构问题以捷克语言。

我需要按月在子文件夹中列出文件。我想用通配符那样:

ls export/*prosince\ 2013/* 

虽然这工作,当我想在通配符使用UTF8我得到“没有这样的文件或目录”

ls export/*září\ 2013/* 

地点看起来正确

winsik:Fotky vita$ locale 

LANG="cs_CZ.UTF-8" 
LC_COLLATE="cs_CZ.UTF-8" 
LC_CTYPE="cs_CZ.UTF-8" 
LC_MESSAGES="cs_CZ.UTF-8" 
LC_MONETARY="cs_CZ.UTF-8" 
LC_NUMERIC="cs_CZ.UTF-8" 
LC_TIME="cs_CZ.UTF-8" 
LC_ALL= 

在shell命令中如何使用utf8字符?

编辑:我发现了奇怪的情况,如果我让终端用Tab键完成一些UTF8路径,然后使用这些字符,那么它的作品,但是当我通过键盘键入它不 - 在terminal.app和iterm2.app

winsik:Fotky vita$ bind -v | grep meta 
set convert-meta off 
set input-meta on 
set meta-flag on 
set output-meta on 
+0

什么是Bash Readline配置中的元变量设置为? IIRC'bind -V | grep meta' – tripleee

+0

附加到问题中,我目前也发现了奇怪的行为 - 请参阅编辑 –

+1

我可以推测Bash使用的Unicode规范化方式与您的系统不同,但这是一个非常严重的错误。还是有可能这些文件位于外部文件系统上,且具有非默认或破坏的规范化?换句话说,文件名中的编码字节是什么,以及在提示符下键入它们的时间?您的终端也可能是罪魁祸首,但是如果您在控制台上使用默认终端,那看起来更不可能。 – tripleee

回答

1

大多数Unicode的系统行为使用Unicode正常化的一种形式“完全编排的”,而苹果通常使用“完全分解”。有关背景信息,请参阅Unicode equivalence in Wikipedia;但总之,有两种方法可以表示重音字符,如ř - 一个预先组合的单码点(U+0159),或者一个普通的r(U+0072),后面跟着一个合成口音(U+030C)字体渲染器。

如果Unicode规范化是问题,那么您将无法成功重复以下步骤。这是在OSX Yosemite的终端机上。

yosemite:~ tripleee$ touch 'Jiří' 

yosemite:~ tripleee$ ls 
Jiří 

yosemite:~ tripleee$ printf '%s\n' * 
Jiří 

yosemite:~ tripleee$ printf '%s' * | xxd 
0000000: 4a69 72cc 8c69 cc81      Jir..i.. 

yosemite:~ tripleee$ rm 'Jiří' 

(你可以从链接页面告诉,加盟卡隆U + 030C的UTF-8编码为两个字节的0xCC 0x8C)

yosemite:~ tripleee$ perl -e 'open(F, "Ji\N{U+0159}\N{U+00ED}")' 

yosemite:~ tripleee$ ls 
Jiří 

yosemite:~ tripleee$ printf '%s' * | xxd 
0000000: 4a69 72cc 8c69 cc81      Jir..i.. 

因此,大家可以看到,即使我特别要求预先分解的字符U + 0159和U + 00ED,操作系统在创建文件之前将它们归一化以分解。

这应该是一个评论,但我把它作为一个推测性的答案发布,希望它至少可以帮助你驳倒这个假设。如果你可以重复这个没有问题,我想我们可以排除Unicode规范化作为问题的可能来源。

+0

我能够在相同的步骤中做到这一点(在此列表中,变音符号不会覆盖字母,我可以像往常一样看到它们:'Jiří')但所有代码都是相同的。所以我想终端和输入正常化是好的。我将检查目录本身的字符 - 它们是由照片应用程序生成的。所以可能Iam试图解决一些其他问题:) –

+0

你的评论说,你看到的变音单独分开,但复制/粘贴“我可以像往常一样看到他们:'Jiří'”为我显示与caron在r上,和对我的急切。你是说你看起来不一样吗? – tripleee

+0

在上面的回答中,我没有看到caron和r和r,而是作为单独的字符(我认为它的stackoverflow格式化)。在终端,我通常看到他们上面的字母。 –