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


15

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

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

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

有没有某种形式的:digit:可以做到这一点?


2
应当注意,pattern仅在扩展的 globing结束时才有效:shopt -s extglob
donothingsuccessful 2012年

Answers:


20

怎么样:

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

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

如评论中所述,这是bash的工作,请尝试例如:

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

3
请注意,ls此处的bash(即)不支持正则表达式。这些是文件名表达式(全球)。您可以在示例中看到差异:这*是一个通配符,在正则表达式中不存在,可用于.*实现相同的目的。正则表达式比遍历功能强大得多。
Christopher K.

2

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

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

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

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

如果要获取的输出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扩展”,“ posix-minimal-basic”,“ sed”您可以运行find -regextype help以查找系统支持的功能。


0

使用您已经在使用的ksh扩展glob(或bash -O extglobor 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选项,在bash中添加(D)glob限定符zsh,或将in 设置FIGNORE为。!(.|..)ksh93

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.