好的,这个问题针对的是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_DOTS
shell 选项。这在zsh
用户手册的 § 14.8 中。请注意,即使打开此选项,.
和也始终被排除。..
在bash
:
设置dotglob
shell 选项。这在bash
用户手册的 § 3.5.8 中。请注意,设置GLOBIGNORE
shell 变量会隐式设置dotglob
;bash
与 不同zsh
,它不会在启用时自动排除.
和;但..
dotglob
bash
将要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 {,.}[!.]*