使用“ls”和正则表达式列出

使用“ls”和正则表达式列出

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

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

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

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

答案1

怎么样:

ls -d -- *[!0-9][0-9].txt

!该组开头的 补充了其含义。

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

printf "%s\n" *[!0-9][0-9].txt

答案2

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

如果你确实想使用正则表达式,你可以find -regex这样使用:

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'

默认情况下查找是递归的,但ls事实并非如此。要仅查找当前目录中的文件,您可以使用-maxdepth 1.查找与路径中的文件名匹配的内容,这就是为什么./如果您运行 find in ,文件名会以 开头.。正则表达式首先是为了\./解决这个问题。请注意,在正则表达式中,.是匹配任何字符的特殊字符,但这里我们确实需要一个点,这就是为什么我们用反斜杠对其进行转义。我们对 中的点执行相同的操作.txt,因为正则表达式也会匹配Atxt。数字类别与通配符相同,只是您需要^而不是!反转字符类别。

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

 find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;

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

find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'

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

答案3

使用您已经使用的ksh 扩展 glob(或bash -O extglob或),这将是:zsh -o kshglob

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

或者

ls -d -- !(*[[:digit:]])[[:digit:]].txt

如果你想匹配a1.txt 2.txta12.txt不是也不是12.txt

但请注意,在 ksh 和 bash 中(除非您设置选项failglob来获得类似于 zsh 的行为),如果该模式与任何文件都不匹配,则该模式将按字面意思传递给ls,并且如果该(奇怪命名的)文件碰巧存在,ls即使它与模式本身不匹配,也会被列出。

要包含.2.txt,请设置dotglob选项 in bash、添加(D)glob 限定符 inzsh或设置FIGNORE!(.|..)in ksh93

相关内容