要列出所有以 10 或 11 或 12 结尾的文件,我已经尝试过ls *[10-12]
,ls *[10,11,12]
但这些都不起作用。我不知道为什么。谁能帮我?
答案1
[...]
火柴一特点 (整理元素在某些 shell 中)如果它在指定的集合中。
[10-12]
表示1
从0
到 的一个或多个字符或1
字符,因此与或¹2
相同。[102]
[0-2]
[10,11,12]
意味着1
, 0
, ,
, 1
... 与 相同[,0-2]
。
在这里你想要:
ls -d -- *1[0-2]
也就是说,(非隐藏)文件名以 1 结尾,后跟任何0
,1
或2
字符。
现在请注意,它也匹配foo110
or foo112345612
。
如果你不想要这样,那么你需要类似的东西:
ls -d -- *[!0-9]1[0-2] 1[0-2]
但这不匹配foo010
如果在foo10
,中foo00010
,foo110
您想要foo10
和foo00010
匹配,则使用ksh
orbash -O extglob
或zsh -o kshglob
:
ls -d -- !(*[0-9])*(0)1[0-2]
请注意,除了 with 之外zsh
,如果任何这些模式不匹配,这些模式将按原样传递给ls
,因此如果存在这样命名的文件,您最终可能会列出不需要的文件。使用bash
,您可以设置failglob
选项来解决这个问题。
zsh
是唯一具有 glob 运算符来匹配数字范围的 shell。
ls -d -- *<10-12>
将匹配以 10 到 12 之间的数字结尾的文件。它也会匹配,foo110
因为后面foo1
跟着10
.你可以这样做(用extendedglob
):
ls -d -- (^*[0-9])<10-12>
尽管。
zsh
也是引入大括号扩展类型的 shell {10..12}
(几年后由 ksh93 和 bash 复制)。
然而,就像{10,11,12}
等价物一样,那就是不是通配符。这是在通配之前完成的一种扩展形式。
ls -d -- *{10..12}
首先扩展为:
ls -d -- *10 *11 *12
zsh
如果这 3 个 glob 中的任何一个失败,则该命令将在(和)中中止bash -O failglob
。
1 但请注意,在多个 shell 和语言环境中,包括bash
在典型 UTF-8 语言环境中的 GNU 系统中,例如en_US.UTF-8
,[0-1]
可能会匹配比 0 和 1 更多的字符,包括 ٠ота०০੦૦୦௦౦౸೦൦෦๐໐༠༳၀႐០៰᠐᥆᧐ 之类的内容᪀᪐᭐᮰᱀᱐⁰₀↉⓪⓿〇㍘꘠꣐꤀꧐ ꧰꩐꯰0
答案2
尝试这个 :
ls *{10,11,12}
或者
ls -l *{10,11,12}
(无法显示隐藏文件)
答案3
这应该有效:
ls -d -- *1[0-2]
请记住,它[]
代表一组字符,如果是数字,则可以从 [0-9]
答案4
ls *@(10|11|12)
这就是您正在寻找的。
这需要extglob
使用启用肖普特, IE,shopt -s extglob
。此外,您可以附加该行~/.bashrc
以永久启用它。
有关其工作原理的更多信息,请参阅有关模式匹配的官方 Bash 手册页。