在ls命令中匹配文件名(bash)

12

我有以下文件

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

有没有一种方法只列出文件,而不是全部列出

tcpdump-12
tcpdump-24

我能做到

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

但是我正在寻找更通用的解决方案,可以接受任意数量的数字,类似于使用vim或Python正则表达式时的tcpdump-[0-9]+。


不是 ls 做通配符匹配,而是你的 shell。 - tripleee
请注意,并非所有的shell都支持[[:digit:]]语法。快速实验表明,bash、zsh和dash支持,但tcsh和ksh不支持(至少默认情况下)。 - Keith Thompson
4个回答

20

要使用高级模式匹配功能,需要在bash中打开扩展全局匹配功能。

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

哦,+1,不知道那个,虽然在正则表达式语法方面有点反常。 - paxdiablo
8
这是 Bash(一种计算机程序语言)。反常现象不应该令人感到惊讶。 - Ignacio Vazquez-Abrams

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

4
我不确定你为什么要使用[[:digit:]]而不是[0-9]; 你是否考虑到文件名可能包含其他类型的数字?
大多数其他答案都很好,但一种快速且粗略的解决方案是:
ls tcpdump-*[0-9]

它适用于你所拥有的特定文件集,但也会匹配类似于tcpdump-FOO7这样的文件名。

在通用脚本中,值得花费精力确切地匹配你想要的模式。在一次性交互式shell命令中,只要能在当前情况下工作的松散快捷方式就可以很有用。


使用 [[:digit:]] 是一个好的编程习惯,特别是如果你希望你的代码有一天能够在像 EBCDIC 这样奇怪的东西上工作。对于一次性的任务来说,这肯定是过度设计了,但不要否认好习惯的重要性。 - tripleee
@tripleee:就算不值钱,[0-9] 在 EBCDIC 中也只匹配数字。字母是非连续的,但数字是连续的。并且,并非所有 shell 都支持 [[:digit:]] 语法。 - Keith Thompson

0
你可以将ls的输出导入到grep中。Grep有一个“反转”选项(显示不匹配的行),所以你可以这样做:
 ls tcpdump-* | grep -v '\.delay$'

1
修正(去掉‘*’,加上‘\’转义点号,加上‘$’锚定至文件末尾)。 - Keith Thompson
1
实际进行正则表达式过滤的语法(而不是执行反向过滤的-v)是-e,如果你需要的话。 - fiatjaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接