我有一个文件夹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
使用zsh
shell(例如交互式bash
shell):
zsh -c 'xdg-open A/*(.)'
这将使用.
glob 修饰符,仅zsh
匹配目录A/*
下的常规文件A
。为了将符号链接也匹配到常规文件,请使用A/*(-.)
通配模式。