在ls(bash)中匹配文件名

时间:2011-10-25 04:18:17

标签: regex bash

我有以下文件

tcpdump-12
tcpdump-12.delay
tcpdump-24
tcpdump-24.delay

有没有办法ls只有文件

tcpdump-12
tcpdump-24

我能做到

ls tcpdump-[[:digit:]][[:digit:]]

但我正在寻找一些更通用的东西,可以使用任意数量的数字,如tcpdump- [0-9] +,如果我使用的是vim或python正则表达式。

5 个答案:

答案 0 :(得分:17)

$ ls
tcpdump-12  tcpdump-12.delay  tcpdump-24  tcpdump-24.delay
$ shopt -s extglob
$ ls tcpdump-+([[:digit:]])
tcpdump-12  tcpdump-24

答案 1 :(得分:7)

如果您确定所有不需要的文件以“.delay”结尾,则可以执行以下操作:

ls --ignore '*.delay'

ls --ignore '*.delay'

答案 2 :(得分:4)

我不确定你为什么使用[[:digit:]]而不是[0-9];你是否齐心协力,文件名可能包含其他类型的数字?

其他大多数答案都很好,但是快速而肮脏的解决方案是:

ls tcpdump-*[0-9]

它适用于您拥有的特定文件集,但它也会匹配tcpdump-FOO7等文件名。

在通用脚本中,值得精确匹配您想要的模式。在一个简短的交互式shell命令中,恰好适用于当前情况的草率快捷方式可能很有用。

答案 3 :(得分:1)

您可以将ls的输出传输到grep中。 Grep有一个“反转”选项(显示不匹配的行),所以你可以这样做:

 ls tcpdump-* | grep -v '\.delay$'

答案 4 :(得分:0)

如果您不介意通过外部过滤器传递它们,可以使用:

ls -1 tcpdump-* | grep '^tcpdump-[0-9]*$'

请记住,最终会为每行提供一个而不是一个很好的多列ls输出。

如果您正在处理该列表,那就不会太重要,但是,如果您只是想在目录列表中看到这些文件,那就不够好了。我假设前者,否则,这个问题并不属于SO: - )