【问题标题】:Bash asterisk omits files that start with '.'? [duplicate]Bash 星号会忽略以“.”开头的文件? [复制]
【发布时间】:2014-01-20 15:24:28
【问题描述】:

我正在使用 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


    【解决方案1】:

    不是循环省略了这些文件,而是*被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
    

    但是,在这种情况下,我会坚持明确使用 .* *,因为这是一个简单的解决方案。

    【讨论】:

    【解决方案2】:

    你可以设置dotglob

    shopt -s dotglob
    for item in *; do echo "$item"; done
    

    【讨论】:

    • 这似乎解决了我在这里遇到的具体问题。从 shopt 手册页:“dotglob 如果设置,bash 在路径名扩展的结果中包含以‘.’开头的文件名。”但是使用后我必须取消设置shopt吗?
    • @user3143122,不,您应该取消设置。您应该按照我回答的后半部分将其恢复到以前的值。在最初设置时取消设置与在最初取消设置时保持设置一样糟糕。
    • 如果您在 bash 脚本中设置了 dotglob,该设置仅适用于您的脚本,不会影响您的 shell 设置
    • @paxdiablo,明白了,最好恢复原状。但从我读过的内容来看,默认设置是未设置的。更改它会影响 shell 本身,还是只是 shopt 在我的脚本中的行为?
    • 看起来我的问题已经预料到了 :)
    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2015-01-26
    • 2012-05-05
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多