如何使用 _one_ shell globbing 表达式列出所有文件(当然还有隐藏文件!)?

mat*_*ath 7 shell globbing

好的,这个问题针对 Unix/Linux shell!

我想要一个 shell globbing(又名通配符)模式或 GLOBIGNORE 列表,以非递归方式(maxdepth == 1)匹配当前目录中的所有文件,包括隐藏文件。到目前为止,我必须执行两个命令或使用较长的解决方法(见下文):

ls -lad *vim*
ls -lad .*vim*
Run Code Online (Sandbox Code Playgroud)

在使用 zsh 时。如果我记得的话,dash 和 bash 是一样的,对吧?

简短的解决方法:

ls -la | grep vim
find . -maxdepth 1 | grep vim
Run Code Online (Sandbox Code Playgroud)

我想了一百次:难道没有一个简单的通配解决方案吗?为什么不*匹配点字符?

Jde*_*eBP 11

* 确实匹配一个.字符。

.当它是名称的第一个字符时,它根本不匹配。这为“隐藏”文件提供了所谓的“点文件”机制。

zsh

设置GLOB_DOTS外壳选项。这在zsh用户手册的第 14.8 节中。请注意,即使打开了此选项,...也始终被排除在外。

bash

设置dotglob外壳选项。这在bash用户手册的第 3.5.8 节中。请注意,设置GLOBIGNOREshell 变量会隐式设置dotglob; 这bash(与zsh)不会自动排除.,并..dotglob启用; 但这bash GLOBIGNORE设置时做到这一点。所以设置GLOBIGNORE=.会有开启dotglob 排除.和的效果..

在 GNU 中find

不要做任何事情。截至findutils4.2.2,对于通配-name,并-iname 匹配以点作为第一个字符的名称。这在findutils用户手册的第 2.1.1 节中。

  • 小心这个!在 Bash 中 .* 匹配包括一个目录在内的所有内容。 (3认同)

dan*_*ann 5

如果您不想更改任何选项,则可以使用以下任何选项:

ls -ld {,.}*vim*
ls -ld *vim* .*vim*
find . -maxdepth 1 -name "*vim*"
Run Code Online (Sandbox Code Playgroud)

  • @math:在 bash 中你可以使用像 `{a,b,c}x` → `ax bx cx` 这样的东西,所以 `{,.}*vim*` 扩展为两个参数 `*vim* .*vim*` (3认同)