我想要 glob 每个隐藏文件和目录,但不是当前 ( .
) 和父目录 ( ..
)。
我正在使用 bash。
观察当前行为:
$ ls -a
. .. ...a ...aa ..a ..aa .a .aa .aaa a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
我想像.*
这样
$ echo .*
...a ...aa ..a ..aa .a .aa .aaa
有外壳选项dotglob
$ shopt -s dotglob
以某种方式起作用;现在我可以使用*
glob 一切(隐藏或不隐藏),但.
不能..
$ echo *
...a ...aa ..a ..aa .a .aa .aaa a
但现在我无法区分隐藏与否。另外,.*
仍然是 globs.
和..
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
有没有办法.*
不扩展到.
and ..
?
答案1
您可以使用该GLOBIGNORE
变量来隐藏.
和..
目录。这也会自动设置dotglob
选项,因此*
现在会匹配隐藏文件和非隐藏文件。不过,您可以再次手动取消设置dotglob
,这会给出您想要的行为。
看这个例子:
$ ls -a
. .. a .a ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
请注意许多用户在评论中展示的以下极端情况:
.
..
只要GLOBIGNORE
具有非空值,并且总是被忽略。GLOBIGNORE=":" ; echo .*
例如,适用于上面的示例,尽管它的可读性较差。- 如果你想匹配隐藏仅目录(并非所有隐藏文件),因此 glob 带有尾部斜杠,
echo .*/
您需要设置GLOBIGNORE='.:..:./:../'
,因为 glob 将匹配./
和../
,必须显式排除它们以防止它们出现在结果中。
答案2
下面的第一个 glob 需要一个前导点和至少一个附加的非点字符。这两个 glob 一起将匹配任何可能的隐藏文件,包括具有多个前导点的文件,但不匹配.
或..
,这正是您所要求的。
ls -ld .[!.]* ..?*
答案3
您只是在寻找文件吗?你有能力使用吗find
?
像(假设 GNU find
):
find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"
答案4
您想显示隐藏的文件/文件夹但是.
和..
?
使用这个 bash 通配符{.[!.]*,..?*}
样本数据
您可以尝试生成示例数据:
$ touch ...a ...aa ..a ..aa .a .aa .aaa a
$ mkdir ...b ...bb ..b ..bb .b .bb .bbb b
证明
您可以在下面看到预期删除的条目:
$ diff <(\ls -a) <(\ls -ad {.[!.]*,..?*})
1,3d0
< .
< ..
< a
11d7
< b
专业版
对于删除所有隐藏元素很有用,例如:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
# <regenerate sample data here>
$ rm -rf {.[!.]*,..?*}
# No error