如何使用 _one_ shell 通配符表达式列出所有文件(当然也包括隐藏文件!)?

如何使用 _one_ shell 通配符表达式列出所有文件(当然也包括隐藏文件!)?

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

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

ls -lad *vim*
ls -lad .*vim*

使用 zsh 时。如果我没记错的话,dash 和 bash 是一样的,对吗?

简短的解决方法:

ls -la | grep vim
find . -maxdepth 1 | grep vim

我曾无数次地思考:难道没有一个简单的通配符解决方案吗?为什么不*匹配点字符?

答案1

* 匹配一个.字符。

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

zsh

设置GLOB_DOTSshell 选项。这在zsh用户手册的 § 14.8 中。请注意,即使打开此选项,.和也始终被排除。..

bash

设置dotglobshell 选项。这在bash用户手册的 § 3.5.8 中。请注意,设置GLOBIGNOREshell 变量会隐式设置dotglobbash与 不同zsh,它不会在启用时自动排除.和;但..dotglobbash 将要GLOBIGNORE设置时执行此操作。因此设置GLOBIGNORE=.将具有打开的效果dotglob 不包括...

在 GNU 中find

不做任何事。从4.2.2 开始,和的findutils通配符-name-iname 已经匹配以点作为第一个字符的名称。这在findutils用户手册的 § 2.1.1 中。

答案2

如果你不想更改任何选项,以下任何一个都可以:

ls -ld {,.}*vim*
ls -ld *vim* .*vim*
find . -maxdepth 1 -name "*vim*"

答案3

在 bash 中,启用点团选项:

shopt -s dotglob

默认情况下,隐藏文件是隐藏的,不会引起意外和烦恼 - 例如,您ls在主目录中运行,看到上个月的一些文件,尝试删除它们,rm *net*并在不知不觉中删除了您精心编写的.nethackrc.

答案4

基于@daniel kullman 的回答,这似乎可以用一个相当简单的 glob 来实现你想要的,即使它严格来说不是一个单一的 gob。

在当前目录中的所有文件中递归搜索字符串“blah”,包括隐藏文件,但不包括导致搜索父目录结构的“..”:

grep blah {,.}[!.]*

相关内容