如何全局显示除当前目录和父目录之外的每个隐藏文件

如何全局显示除当前目录和父目录之外的每个隐藏文件

我想要 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

相关内容