从终端打开文件时使用通配符/通配符

从终端打开文件时使用通配符/通配符

我有一个文件夹A。该文件夹内有一些文件a,b,c,d,并且有一个子文件夹 ,其中B包含文件e,f,g

假设我想打开文件a,b,c,d:那么我只需键入xdg-open *。但是,这也会进入子文件夹B并打开e,f,g。最简单的打开方式是什么a,b,c,d

编辑:我真正的意思是如何打开文件夹中的所有文件,而不是任何子文件夹中包含的文件。

答案1

怎么样find A -maxdepth 1 -type f -exec xdg-open {} \;

这应该会打开文件夹 A 中的所有文件,而不会超出顶层。

答案2

方法#1 - Shell 扩展

如果您知道您要查找的项目是按顺序命名的,则可以通过多种方式使用 shell 扩展。

例子

$ xdg-open [a-d]
$ xdg-open {a..d}
$ xdg-open a* b*

方法 #2 - 扩展通配符

在 Bash(版本 3.2+)中,您可以使用扩展通配符来包含除某些内容之外的所有内容,我相信这就是您所要求的。

例子

$ xdg-open !(B)
$ xdg-open !(A|B)

演示

我会经常使用,echo这样我就可以看到 globstar 或扩展的 globbing 的结果,而无需在文件和/或目录的扩展列表上实际运行真正的命令。

例子

举例来说,我有以下文件目录。

$ ls -l
total 8
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 a
drwxrwxr-x 2 saml saml 4096 Nov 15 20:23 A
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 b
drwxrwxr-x 2 saml saml 4096 Nov 15 20:12 B
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 c
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 d
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 e
-rw-rw-r-- 1 saml saml    0 Nov 15 20:12 f

现在,如果我们尝试上述扩展,我们可以看到它们如何公平。

$ echo [a-d]
a A b B c d

$ echo {a..d}
a b c d

$ echo a* b*
a b

$ echo !(B)
a A b c d e f

$ echo !(A|B)
a b c d e f

扩展通配符

您可以使用多种其他方法来控制 shell 匹配的方式。例如:

  ?(pattern-list)   Matches zero or one occurrence of the given patterns
  *(pattern-list)   Matches zero or more occurrences of the given patterns
  +(pattern-list)   Matches one or more occurrences of the given patterns
  @(pattern-list)   Matches one of the given patterns
  !(pattern-list)   Matches anything except one of the given patterns

您可以在这篇 Linux Journal 文章中阅读有关它们的更多信息,标题为:Bash 扩展通配符

答案3

使用zshshell(例如交互式bashshell):

zsh -c 'xdg-open A/*(.)'

这将使用.glob 修饰符,仅zsh匹配目录A/*下的常规文件A。为了将符号链接也匹配到常规文件,请使用A/*(-.)通配模式。

相关内容