如何在 Bash 中检查是否存在名称带有星号的文件

如何在 Bash 中检查是否存在名称带有星号的文件

我在 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

相关内容