我在 Bash 脚本中遇到了一个错误,该脚本创建的文件名称中带有星号(“*”)。我不想要这种情况,所以我尝试在脚本的各个点测试是否存在这种情况,以便找出它发生的位置。我一直在为此而烦恼,但还没有找到一种可靠(且简短)的方法来解决这个问题。
如果我正在寻找像“z”这样的字母,我可以使用
for i in *z*; do
if [ ${i/z/} != '*z*' ] ; then
echo Found one
break
fi
done
但是如果我尝试使用星号,就会遇到麻烦:似乎“in”后面出现的任何“*”都会导致所有文件名连接起来,无论它们中是否包含星号。
答案1
任何 glob 通配符都可以通过在它前面加上反斜杠或将其放在引号中以防止 shell 对其进行保护来转换回文字字符:
ls -d -- *\**
ls -d -- *'*'*
rm -i -- *\**
请注意,它find
在其操作本身中处理 glob -name
,因此即使字符串可能(并且应该)被引用以保护它免受 shell 的侵害,但仍然需要一个反斜杠来保护它find
:
find . -name '*\**' -print
如果你想要一份好的报告,你可以循环播放比赛或者find
直接发送它们
shopt -s nullglob
for i in *\**
do
printf "Found file with wildcard: '%s'\n" "$i"
done
或者
find -name '*\**' -printf Found file with wildcard: '%P'\n"
答案2
写完这个问题后,我立即找到了一个可行的答案
for i in *; do
if [ "${i/\*/}" != "$i" ] ; then
echo found one in $i;
fi;
done
如果任何文件名包含星号,$i 将是所有星号的串联,但由于 if 条件中的引号,它可以起作用。
答案3
简单的ls | fgrep '*'
给你带有内部的文件名列表*
。
如果你只是想知道这样的文件是否存在:ls | fgrep -q '*' && echo Found