Linux 终端中的文件全局模​​式

File Glob Patterns in Linux terminal

我想搜索可能包含 kavikabhi 的文件名。 我在终端中写了命令:

ls -l *ka[vbh]i*

kai之间可能有vbh .

我写的代码不正确。正确的命令是什么?

执行此操作的一个好方法是使用扩展的 glob。使用它们,您可以在 Bash.

上执行正则表达式

首先您必须启用 extglob 功能,因为默认情况下它是禁用的:

shopt -s extglob

然后,编写一个具有所需条件的正则表达式:stuff + ka + vbh + i + stuff。总计:

ls -l *ka@(v|bh)i*

语法与普通正则表达式有点不同,因此您需要阅读 Extended Globs 那...

@(list): Matches one of the given patterns.

测试

$ ls
a.php  AABB  AAkabhiBB  AAkabiBB  AAkaviBB  s.sh
$ ls *ka@(v|bh)i*
AAkabhiBB  AAkaviBB

稍长的 cmd 行可以使用 find、grep 和 xargs。它的优点是可以轻松扩展到不同的搜索词(通过扩展 grep 语句或使用 find 的其他选项),更具可读性(imho)和能够对找到的文件执行特定命令的灵活性

find . | grep -e "kabhi"  -e "kavi" | xargs ls -l

你可以通过在bash中使用curly braces得到你想要的:

ls -l *ka{v,bh}i*

注意:这不是正则表达式问题,而是 "shell globbing" 问题。 Shell "glob patterns" 与正则表达式不同,尽管它们在许多方面相似。