Bash 通配符不扩展隐藏文件

Bash 通配符不扩展隐藏文件

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

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

#!/bin/bash
shopt -s extglob

for i in "$(pwd)"/*; do
  echo "$i"
done

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

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

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

答案1

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

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

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

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

for i in "$(pwd)"/*; do
  echo "$i"
done

答案2

没有 dotglob 的 posix 解决方法

#!/bin/sh

for i in "$PWD"/* "$PWD"/.*
  do
    [ "${i##*/}" = . ] || \
    [ "${i##*/}" = .. ] || \
    [ "${i##*/}" = \* ] || \
    [ "${i##*/}" = .\* ] && continue

    echo "$i"
done

相关内容