我正在尝试制作一个 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