如果文件夹存在 - 使用通配符[复制]

问题描述 投票:1回答:1

这个问题在这里已有答案:

或“如何处理带前缀的文件夹名称?”

在文件夹中我有两个(或更多)foo_*文件夹

foo_0 FOO_1

我想要达到的目标是

  • 如果有一个或多个foo_*文件夹,请执行操作
  • 使用通配符*

目前我这样做(直接检查目录foo_0是否存在):

prefix=foo_

if [ -d "./${prefix}0/" ]; then
  printf "foo_0 folder found!"
  # delete all foo_* folders
fi

有目录0-to-N以上工作,但我不确定我将永远有一个foo_0文件夹...

我想使用通配符:

prefix=foo_

if [ -d "./${prefix}*/" ]; then                 # By using wildcard...
  printf "One or more foo_* folders found!"     # this never prints
  # delete all foo_* folders
fi

我已经读过引号内的通配符*失去了它的权力,但将它放在引号之外会抛出:

if [ -d "./${prefix}"* ]  <<< ERROR: binary operator expected

或者是否可以使用某种类型的正则表达式? ./foo_\d+


我没有(可以说)喜欢的唯一解决方案是使用set

set -- foo_*
if [ -d $1 ]; then
  printf "foo_* found!"
fi

但它擦除了程序参数。 我有什么其他不错的解决方案吗?

bash shell
1个回答
0
投票

我认为几乎所有这些情况的一个很好的解决方案是在测试中使用ls,因为它通常很简单:

if [ -n "$(ls -d foo_*)" ]; then ...如果你想做更多正则表达式匹配,你可以shopt -s extglob然后匹配ls foo_+([0-9])

还有一个使用多个shell选项的全bash解决方案,但它不容易记住,所以我会把它留给另一张海报;-)

编辑:正如@Pesa所指出的,如果只有一个空的匹配目录,使用ls foo_*就会失败,因为只列出该目录的空内容并且ls foo_*不仅匹配目录,所以最好使用-d

© www.soinside.com 2019 - 2024. All rights reserved.