Cygwin 按照 Windows 的方式不区分大小写,例如:
$ touch ABC; rstr=$(openssl rand -base64 12); echo $rstr; echo $rstr > AbC; cat abc
dGRMOHqqoy0/nc96
dGRMOHqqoy0/nc96
$ ls | grep -i abc
ABC
文件或目录名中的字符大小写会被存储,但在对其进行操作时会被忽略。
ABC
,AbC
然后abc
选择相同的文件。
是否有一种可靠的方法来获取给定文件路径或目录路径的大小写存储为?grep 技巧很快就会变得非常麻烦。
答案1
在 中zsh
,并且打开该extendedglob
选项,您可以执行以下操作:
$ set -o extendedglob
$ printf '%s\n' (#i)path/to/file
Path/to/FILE
path/to/file
与存储箱一起获得。
在ksh93
:
$ printf '%s\n' ~(i)path/to/file
Path/to/FILE
(请注意,如果没有匹配,它将扩展为~(i)path/to/file
,ksh93 没有相当于 nomatch
或failglob
选项,尽管您可以使用~(Ni)path/to/file
它在不匹配时扩展为空)
在bash
打开extglob
、failglob
和nocaseglob
选项的情况下,您可以执行以下操作:
$ shopt -s extglob failglob nocaseglob
$ printf '%s\n' @(path)/@(to)/@(file)
Path/to/FILE
如果没有extglob
,您也可以这样做printf '%s\n' [p]ath/[t]o/[f]ile
,尽管这更难可靠地实现自动化。
(无论如何,在 shell 下执行与您相同的操作ls | grep -i
,即它必须读取完整的目录内容以查找匹配的文件。请注意,与 for 一样grep -i
,大小写比较是根据语言环境进行的,它可能与方式不同NTFS做大小写比较)
答案2
不完全是您要求的,但可能您感兴趣。
我把它带到了我不记得的地方,但它有效:
区分大小写的 NTFS
您无法在 Windows 上为单个文件夹或卷启用区分大小写,但可以为整个系统启用区分大小写。
您需要更改注册表项的值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
从 1 到 0 并重新启动系统。
如果这样做,您还需要从以下位置更改posix=0
为posix=1
任何安装/etc/fstab
:
d:\cyg_pub /pub NTFS binary,posix=1,nouser 0 0
在那之后
$ cd /tmp
$ touch Pippo
$ touch PIppo
$ touch PIPpo
$ ls P*
Pippo PIppo PIPpo