Bash星号忽略以';开头的文件';?
我正在使用bash脚本迭代目录中的所有文件。但是循环正在跳过以“.”开头的文件,例如“.bashrc”。我不确定.bashrc是否未能通过文件测试,或者是否从通配符“*”中省略。我尝试过在“$item”周围加双引号,但结果相同。如何使此循环包含.bashrc文件Bash星号忽略以';开头的文件';?,bash,file,loops,directory,Bash,File,Loops,Directory,我正在使用bash脚本迭代目录中的所有文件。但是循环正在跳过以“.”开头的文件,例如“.bashrc”。我不确定.bashrc是否未能通过文件测试,或者是否从通配符“*”中省略。我尝试过在“$item”周围加双引号,但结果相同。如何使此循环包含.bashrc文件 id=0 cd $USERDIR for item in * do if [[ -f $item ]]; then cdir[$id]=$item id=$(($id+1))
id=0
cd $USERDIR
for item in *
do
if [[ -f $item ]]; then
cdir[$id]=$item
id=$(($id+1))
echo $item
fi
done
这不是省略这些文件的循环,而是shell对*
的扩展。如果还需要点文件,请使用:
for item in .* *
从bash
手册页:
当模式用于路径名扩展时,必须明确匹配名称开头或斜杠后面的字符”
,除非设置了shell选项dotglob
dotglob
选项上的最后一句话似乎很有用,但您应该小心更改可能会影响后续代码的选项。使用它们最安全的方法是确保将它们设置回原始值,例如:
rest_cmd=$(shopt -p dotglob) # Get restoration command
shopt -s dotglob # Set option
for item in * ; do
blah blah blah
done
${rest_cmd} # Restore option
但是,在这种情况下,我会坚持显式使用
**
,因为这是一个简单的解决方案。您可以设置dotglob
shopt -s dotglob
for item in *; do echo "$item"; done
伟大的此处的详细信息:不要忘记,
*
将匹配当前目录和父目录,
和。
,这可能会导致问题,具体取决于您尝试执行的操作。@Keith:是的,在这种情况下不是这样,因为它使用-f
进行过滤,只处理文件,但是我以前一直被无限循环所困扰,因为我一直在处理
“子目录”:-,这似乎解决了我在这里遇到的具体问题。在shopt手册页中:“如果设置了dotglob,bash会在路径名扩展的结果中包含以“.”开头的文件名。”但是我必须在使用shopt后取消其设置吗?@user3143122,不,您不应该取消其设置。你应该按照我回答的后半部分把它恢复到以前的值。在最初设置时将其取消设置与在最初取消设置时将其保留一样糟糕。如果在bash脚本中设置dotglob
,则该设置仅适用于脚本,不会影响shellsettings@paxdiablo,明白了,最好还是回到原来的样子。但据我所知,默认值是未设置的。更改它是否会影响shell本身,或者只是shopt在我的脚本中的行为?看起来我的问题已被取消脚本:)