我有以下文件
tcpdump-12
tcpdump-12.delay
tcpdump-24
tcpdump-24.delay
有没有一种方法只列出文件,而不是全部列出
tcpdump-12
tcpdump-24
我能做到
ls tcpdump-[[:digit:]][[:digit:]]
但是我正在寻找更通用的解决方案,可以接受任意数量的数字,类似于使用vim或Python正则表达式时的tcpdump-[0-9]+。
要使用高级模式匹配功能,需要在bash中打开扩展全局匹配功能。
$ ls
tcpdump-12 tcpdump-12.delay tcpdump-24 tcpdump-24.delay
$ shopt -s extglob
$ ls tcpdump-+([[:digit:]])
tcpdump-12 tcpdump-24
ls --ignore '*.delay'
[[:digit:]]
而不是[0-9]
; 你是否考虑到文件名可能包含其他类型的数字?ls tcpdump-*[0-9]
它适用于你所拥有的特定文件集,但也会匹配类似于tcpdump-FOO7
这样的文件名。
在通用脚本中,值得花费精力确切地匹配你想要的模式。在一次性交互式shell命令中,只要能在当前情况下工作的松散快捷方式就可以很有用。
[[:digit:]]
是一个好的编程习惯,特别是如果你希望你的代码有一天能够在像 EBCDIC 这样奇怪的东西上工作。对于一次性的任务来说,这肯定是过度设计了,但不要否认好习惯的重要性。 - tripleee[0-9]
在 EBCDIC 中也只匹配数字。字母是非连续的,但数字是连续的。并且,并非所有 shell 都支持 [[:digit:]]
语法。 - Keith Thompson ls tcpdump-* | grep -v '\.delay$'
-v
)是-e
,如果你需要的话。 - fiatjaf
ls
做通配符匹配,而是你的 shell。 - tripleee[[:digit:]]
语法。快速实验表明,bash、zsh和dash支持,但tcsh和ksh不支持(至少默认情况下)。 - Keith Thompson