我可以在命令行上使用否定通配符吗?
Can I do a negated wildcard on the command-line?
在命令行上 *tmp*
将匹配名称中包含“tmp”的所有文件。有没有一种快速的方法可以相反,即匹配名称 不 包含“tmp”的所有文件?
我想出了如何让 ls
执行此操作 (ls -I "*tmp*"
),但是如果我想使用其他命令而不是 ls
,那也无济于事。有没有通用的方法?
我忘了注意:我正在使用 zsh。
使用 bash
时,您可以通过以下方式启用 extglob
:
shopt -s extglob
那么你可以使用:
!(*tmp*)
这将否定您的通配符条件。
您终于可以使用 shopt -u extglob
禁用 extglob
。
这取决于你的shell。
在ksh中,你可以这样使用:
!(*tmp*)
在 bash 中,如果您首先使用 shopt -s extglob
启用该功能,同样的事情会起作用。
在 zsh 中,您可以使用 setopt ksh_glob
启用相同的语法,但与另一个 zsh 功能存在冲突,您必须使用 setopt no_bare_glob_qual
禁用该功能才能使上述功能真正起作用。或者,您可以通过 setopt extended_glob
使用 zsh 的本机版本;上面表达式的等效项如下所示:
^*tmp*
在命令行上 *tmp*
将匹配名称中包含“tmp”的所有文件。有没有一种快速的方法可以相反,即匹配名称 不 包含“tmp”的所有文件?
我想出了如何让 ls
执行此操作 (ls -I "*tmp*"
),但是如果我想使用其他命令而不是 ls
,那也无济于事。有没有通用的方法?
我忘了注意:我正在使用 zsh。
使用 bash
时,您可以通过以下方式启用 extglob
:
shopt -s extglob
那么你可以使用:
!(*tmp*)
这将否定您的通配符条件。
您终于可以使用 shopt -u extglob
禁用 extglob
。
这取决于你的shell。
在ksh中,你可以这样使用:
!(*tmp*)
在 bash 中,如果您首先使用 shopt -s extglob
启用该功能,同样的事情会起作用。
在 zsh 中,您可以使用 setopt ksh_glob
启用相同的语法,但与另一个 zsh 功能存在冲突,您必须使用 setopt no_bare_glob_qual
禁用该功能才能使上述功能真正起作用。或者,您可以通过 setopt extended_glob
使用 zsh 的本机版本;上面表达式的等效项如下所示:
^*tmp*