为什么 "$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 是 ash
或 mksh
在 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
我有一个 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 是 ash
或 mksh
在 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