为什么 "$path"/{,.}* 可以在其结果中包含 ".*"?

Why can "$path"/{,.}* include ".*" in its results?

我有一个 bash 脚本,我使用

遍历目录中的所有文件
for x in "$path/"{.,}*; do
    do some stuff here  
done

这确实遍历了所有文件和目录(这就是我想要的), 但它也给了我不存在的文件.*。 我在 android 上使用终端模拟器,所以那里可能是一个错误。 我正在寻找 shell 解决方案,因为我没有大多数 "normal Linux" 命令,例如 sed。

如果你的Shell真的是Bash(如问题原话所述)

运行以下命令:

shopt -s nullglob

将禁用不展开匹配项的默认行为。请注意,这可能会产生令人惊讶的副作用:设置 nullglob 后,ls -l *.NotFilenamesHaveThisSuffix 将与 ls -l.

完全相同

也就是说,你可以做得更好:

shopt -s dotglob
for x in "$path/"*; do
    printf 'Processing file: %q\n' "$x"  
done

将根据设置 dotglob 找到所有隐藏文件 根本不需要 {.,} 习语,并且还将受益于始终忽略 ....


如果您的 Shell 是 ashmksh

在 Android 设备上找到 bash 实际上很常见。如果你有基线POSIXshell,下面的会更稳健

for x in "$path"/* "$path"/.*; do
  [ -e "$x" ] || continue                      # skip files that don't exist
  basename=${x##*/}                            # find filename w/o path
  case $basename in "."|"..") continue ;; esac # skip "." and ".."

  echo "Processing $x" >&2
  : ...put your logic here...
done