Bash 通配符不扩展隐藏文件

Chr*_*haw 3 bash wildcards

我正在尝试制作一个 bash 脚本来处理目录中的每个文件。所有这些文件名都以点开头,因此它们是隐藏的。当我尝试使用通配符获取目录中的所有内容时,通配符没有扩展。

我的循环代码现在看起来像这样:

#!/bin/bash
shopt -s extglob

for i in "$(pwd)"/*; do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

输出只是/Users/.../*. 通配符不会扩展。

这与其他一些线程不同,因为它专门处理隐藏文件。如果我test在目录中添加一个类似的文件,那么它就可以工作。我明白了/Users/.../test

我也尝试在终端中单独运行它并得到相同的结果。如何获取通配符以扩展隐藏文件?

Chr*_*haw 6

我想到了!仔细查看 shopt文档,有一个名为的选项dotglob可用于包含以点开头的文件名!

我添加shopt -s dotglob到脚本的开头,现在可以使用了。输出现在列出了每个隐藏的文件和目录(除了./../)。

我的脚本现在看起来像这样:

#!/bin/bash
shopt -s extglob
shopt -s dotglob

for i in "$(pwd)"/*; do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

  • 也很有用:`shopt -s nullglob` 使通配表达式在没有匹配的情况下扩展为空;"$PWD" 持有与 `pwd` 打印的相同值,但与 `echo "$(pwd)"` 相比,`echo "$PWD"` 可以让你保存一个 fork - 在 Bash 中,命令替换是使用子进程执行的. (2认同)
  • @fra-san,当当前工作目录的路径以换行符结尾时,`$(pwd)`(与 `$PWD` 相反)也无法正常工作。 (2认同)
  • 请注意,此处不需要 `extglob` 来扩展该 glob。如果你想使用扩展的 ksh88 操作符,比如 `@(...)`、`!(...)`、`*(...)`,就需要 `extglob`... (2认同)