使用 `ls` 和正则表达式列出

Web*_*b-E 32 bash wildcards

如何列出文件名以最后一个字符结尾且.txt扩展名为 的文件?

我已经尝试过,ls *+([[:digit:]]).txt但这对于abc12.txtand是正确的abc2.txt

但我只需要得到abc2.txt. 我怎样才能做到这一点?

有没有什么形式:digit:可以做到这一点?

Tho*_*hor 38

怎么样:

ls -d -- *[!0-9][0-9].txt
Run Code Online (Sandbox Code Playgroud)

!在该组的开始补充其含义。

正如评论中所指出的,这是 bash 的做法,请尝试例如:

printf "%s\n" *[!0-9][0-9].txt
Run Code Online (Sandbox Code Playgroud)

  • 请注意,bash(即`ls`)在此处不支持正则表达式。这些是*文件名表达式(全局)*。您可以在示例中看到不同之处:这里,`*` 是一个通配符,在正则表达式中不存在,您可以使用 `.*` 来实现相同的效果。正则表达式比通配符强大得多。 (5认同)

Chr*_* K. 18

该问题要求使用正则表达式。Bash,因此ls,这里不支持正则表达式。它支持的是文件名表达式Globbing),一种通配符形式。正则表达式比这要强大得多。

如果你真的想使用正则表达式,你可以这样使用find -regex

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Run Code Online (Sandbox Code Playgroud)

默认情况下,查找是递归的,但ls不是。要仅在当前目录中查找文件,您可以使用-maxdepth 1. 使用路径查找与文件名的匹配项,这就是为什么./如果您运行 find in文件名开头的原因.。正则表达式开始\./处理。请注意,在正则表达式中,.是匹配任何字符的特殊字符,但在这里我们真的想要一个点,这就是我们用反斜杠转义它的原因。我们对 in 中的点做同样的事情.txt,因为否则正则表达式也会匹配Atxt。数字类与通配符相同,只是您需要^而不是!反转字符类。

如果你想得到 的输出ls,那么你可以这样使用-exec ls

 find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
Run Code Online (Sandbox Code Playgroud)

find支持几种不同的正则表达式风格。您可以指定一个-regextype,例如:

find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Run Code Online (Sandbox Code Playgroud)

对我来说,可能的类型有:“findutils-default”、“awk”、“egrep”、“ed”、“emacs”、“gnu-awk”、“grep”、“posix-awk”、“posix-basic” , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' 您可以运行find -regextype help以找出系统支持的内容。