10

我知道通配符*(本身)将以这样的方式扩展,它意味着“当前文件夹中的所有非隐藏文件”,隐藏文件是以句点为前缀的文件。

我认为有两个用例很有用,但我不知道如何正确执行:

  1. 你怎么能glob...“当前文件夹中的所有文件,包括隐藏文件,但不包括...”?

  2. 你怎么能glob...“当前文件夹中的所有隐藏文件(并且只有隐藏文件),但不包括...”?

4

6 回答 6

16

要扩展paviums 答案并回答问题的第二部分,除.和之外的所有文件都..可以这样指定:

{.[!.]*,*}

根据您的确切用例,最好设置dotglobshell 选项,以便 bash*默认在扩展中包含点文件:

$ shopt -s dotglob
$ echo *
.tst
于 2009-10-19T01:22:08.727 回答
3

Bash Cookbook为您的第二个要求提出了解决方案。

.[!.]*

作为指定“点文件”但避免...

当然,ls可以-A选择,但这不是通配符。

于 2009-10-19T00:51:53.770 回答
2

结合 sth and pavium 答案

# dot files but avoiding . and ..
.[!.]*

# all files but avoiding . and .. 
{.[!.]*,*}
于 2012-04-26T02:52:23.880 回答
1

为了满足您的第一个案例:

echo {.,}[^.]*

或者

echo {.,}[!.]*

编辑

这似乎得到了一切,但比ehemient的短

echo {.*,}[^.]*
于 2009-10-19T01:58:19.863 回答
0

“所有文件”和“所有隐藏文件”是指仅文件,还是指文件和目录?Globbing 对名称进行操作,而不管它属于文件还是目录。其他人对使用 globbing 查找隐藏名称和非隐藏名称给出了很好的答案,但是您可能希望将find命令作为可以区分类型的更简单的替代方法。

要查找“当前文件夹中的所有文件,包括隐藏文件,但不包括 . 或 ..”:

find . -type f

要查找“当前文件夹中的所有文件和目录,包括隐藏文件,但不包括 . 或 ..”:

find . ! -name .

要查找“当前文件夹中的所有隐藏文件(仅隐藏文件),但不包括 . 或 ..”:

find . -name '.*' -type f

要在当前文件夹中查找“所有隐藏文件和目录(仅隐藏文件和目录),但不包括 . 或 ..”:

find . -name '.*' ! -name .

请注意,默认情况下 find 也将通过子目录递归,因此如果您想将其限制为仅可以使用的当前目录:

find . -maxdepth 1 -type f
于 2012-02-26T20:54:45.860 回答
0

所以,即使这是旧的 - 不使用 shopt,这似乎并没有得到完全回答。但是,扩展到目前为止已给出的答案,这些对我有用:

1:

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}

于 2013-10-30T21:30:53.663 回答