Bash 星号省略以“.”开头的文件? [重复]

问题描述 投票:0回答:2

我正在使用 bash 脚本来迭代目录中的所有文件。 但循环会跳过以“.”开头的文件。例如“.bashrc”我不确定 .bashrc 是否未通过文件测试或从通配符“*”中省略。 我尝试过在“$item”周围使用双引号,但结果相同。 如何使该循环包含 .bashrc 文件?

id=0     
cd $USERDIR
for item in *
do
    if [[ -f $item ]]; then
        cdir[$id]=$item
        id=$(($id+1))
        echo $item
    fi
done  
bash file loops directory
2个回答
18
投票

不是loop省略了这些文件,而是shell对

*
的扩展。如果您还想要点文件,请使用:

for item in .* *

来自

bash
联机帮助页:

当模式用于路径名扩展时,名称开头或紧跟在斜杠后面的字符

"."
必须显式匹配 ,除非设置了 shell 选项 dotglob

设置

dotglob

 后,
*
 将为您提供以 
.
 开头以及不以 
.
 开头的文件。请记住,
.
..
不会以这种方式生成,您仍然需要使用像
.*
这样的模式来获取它们(并确保
globskipdots
not设置的)。并注意环境变量 GLOBIGNORE
 - 无论这些 shell 选项设置如何,它都可以删除某些模式。

此外,正如评论中指出的,如果您不希望(例如)参数

X*

 在没有以 
X
 开头的文件时保留为确切的文字值,您还应该设置
nullopt
 shell 选项。这将确保在这种情况下删除 
X*
(以免您尝试对不存在的 
X*
 文件执行某些操作)。

当更改 shell 选项有用时,您应该警惕造成超出直接代码的影响。使用它们的最安全方法是确保将它们设置回原始值,例如:

rest1=$(shopt -p dotglob) # Get restoration commands. rest2=$(shopt -p nullglob) shopt -s dotglob nullglob # Set options. for item in * ; do blah blah blah done ${rest1} ; ${rest2} # Restore options.


请注意,还有

other 设置可能会影响您的结果,例如 nocaseglob

extglob
。所有这些东西之间的交互有点复杂,但在 
bash
 手册页中有详细介绍(主要在“路径名扩展”下)。


7
投票
可以设置

dotglob



shopt -s dotglob for item in *; do echo "$item"; done
    
© www.soinside.com 2019 - 2024. All rights reserved.