如何列出文件名以最后一个字符结尾且.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.txt
但a12.txt
不是也不是12.txt
。
但请注意,在 ksh 和 bash 中(除非您设置选项failglob
来获得类似于 zsh 的行为),如果该模式与任何文件都不匹配,则该模式将按字面意思传递给ls
,并且如果该(奇怪命名的)文件碰巧存在,ls
即使它与模式本身不匹配,也会被列出。
要包含.2.txt
,请设置dotglob
选项 in bash
、添加(D)
glob 限定符 inzsh
或设置FIGNORE
为!(.|..)
in ksh93
。