列出所有以 10 或 11 或 12 结尾的文件

列出所有以 10 或 11 或 12 结尾的文件

要列出所有以 10 或 11 或 12 结尾的文件,我已经尝试过ls *[10-12]ls *[10,11,12]但这些都不起作用。我不知道为什么。谁能帮我?

答案1

[...]火柴特点 (整理元素在某些 shell 中)如果它在指定的集合中。

[10-12]表示10到 的一个或多个字符或1字符,因此与或¹2相同。[102][0-2]

[10,11,12]意味着1, 0, ,, 1... 与 相同[,0-2]

在这里你想要:

ls -d -- *1[0-2]

也就是说,(非隐藏)文件名以 1 结尾,后跟任何0,12字符。

现在请注意,它也匹配foo110or foo112345612

如果你不想要这样,那么你需要类似的东西:

ls -d -- *[!0-9]1[0-2] 1[0-2]

但这不匹配foo010

如果在foo10,中foo00010foo110您想要foo10foo00010匹配,则使用kshorbash -O extglobzsh -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 手册页

相关内容