gpt4 book ai didi

Linux 与 Unix 文件通配符

转载 作者:IT王子 更新时间:2023-10-29 01:03:37 25 4
gpt4 key购买 nike

我想获取 Linux 目录中以大写字母开头的文件列表。在 Unix 中,这很简单

ls [A-Z]*

不过,在 Linux 中,我看到匹配项似乎不区分大小写:

=> ls
A.txt  b.txt  B.txt  c.txt  C.txt

=> ls [A]*
A.txt

=> ls [AB]*
A.txt  B.txt

=> ls [ABC]*
A.txt  B.txt  C.txt


=> ls [A-C]* A.txt b.txt B.txt c.txt C.txt

=> ls [b]*
b.txt


=> ls [a-c]* A.txt b.txt B.txt c.txt

在 Unix 端运行相同的命令如我所料。这是 Linux 一直以来的行为方式吗?使用 awk 解决这个问题很容易,所以我不是以这种方式寻找解决方案,但我想知道我以前是否从未注意到这一点。提前致谢。

最佳答案

结果取决于不同的 shell 选项,特别是:nocasematch nocaseglob还有 LC_COLLATE 变量(用于排序、[-] 等)

$ shopt extglob nocasematch nocaseglob
extglob off
nocasematch off
nocaseglob off


$ printf "%s\n" a A b B c C | sort
a
A
b
B
c
C

所以 [A-C] 范围包含 b 和 c,但不包含 a,同样 [a-c] 应该包含 A 但不包含 C。

$ printf "%s\n" a A b B c C | LC_COLLATE=C sort
A
B
C
a
b
c

给出不同的结果。

$ LC_COLLATE=C ls [A-C]*

应该返回预期结果,此语法仅为新进程执行(ls)设置变量,而不是当前 shell 进程。

编辑:感谢评论,之前的命令是错误的,因为扩展是在设置 LC_COLLATE 之前处理的,最简单的是分成两个命令。

$ export LC_COLLATE=C
$ ls [A-C]*

关于Linux 与 Unix 文件通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280371/

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