Bash 如何测试目录是否以“开始”;";存在

Bash 如何测试目录是否以“开始”;";存在,bash,Bash,如何测试以“xx”开头的目录是否存在。例如xx-a/xx-b/xx-c/。如何测试它们的存在 packagePath="xx*" if [[ -d $packagePath ]]; then rm -rf $packagePath fi 我试过了,但没用。做类似的事情 #To check at least one directory starting with xx exist var=( xx* ) # * will glob for everything that start w

如何测试以“xx”开头的目录是否存在。例如
xx-a/xx-b/xx-c/
。如何测试它们的存在

packagePath="xx*"

if [[ -d $packagePath ]]; then
    rm -rf $packagePath
fi
我试过了,但没用。

做类似的事情

#To check at least one directory starting with xx exist
var=( xx* ) # * will glob for everything that start with xx
for i in "${var[@]}"
do 
  [ -d "$i" ] && echo "exists" && break
done
做点像

#To check at least one directory starting with xx exist
var=( xx* ) # * will glob for everything that start with xx
for i in "${var[@]}"
do 
  [ -d "$i" ] && echo "exists" && break
done

问题是这样一个目录可以有多个,但是
-d
只需要一个。此外,扩展顺序也很重要

dirs=( $packagePath )
if [[ -d ${packagePath[0]} ]] ; then
    rm -rf "${packagePath[@]}"
fi
此外,一旦通配符扩展,您就知道目录已经存在,因此无需再次测试它们的存在性:

dirs=( $packagePath/ )
if [[ ${packagePath[0]} != *\*/ ]] ; then
    rm -rf "${packagePath[@]}"
fi
但是如果你只想移除它们,你不需要测试它们是否存在。简单地

rm -rf $packagePath

应该有效。

问题是这样一个目录可以有多个,但是
-d
只需要一个。此外,扩展顺序也很重要

dirs=( $packagePath )
if [[ -d ${packagePath[0]} ]] ; then
    rm -rf "${packagePath[@]}"
fi
此外,一旦通配符扩展,您就知道目录已经存在,因此无需再次测试它们的存在性:

dirs=( $packagePath/ )
if [[ ${packagePath[0]} != *\*/ ]] ; then
    rm -rf "${packagePath[@]}"
fi
但是如果你只想移除它们,你不需要测试它们是否存在。简单地

rm -rf $packagePath

应该有效。

不需要明确的测试。将
/
添加到模式的末尾将只匹配目录

rm -rf xx*/

没有必要进行明确的测试。将
/
添加到模式的末尾将只匹配目录

rm -rf xx*/

使用
[..]
而不是
[[..]]
。它可以工作:)你能告诉我为什么吗?谢谢你的帮助。RenaudPacalet:只有当只有一个目录与模式匹配时它才能工作。使用
[..]
而不是
[..]]
。有效:)你能告诉我为什么吗?谢谢你的帮助。@RenaudPacalet:只有当只有一个目录与模式匹配时,它才有效。