如果文件夹存在 - 使用通配符

时间:2018-03-05 01:29:09

标签: bash shell

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

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

  

foo_0
  FOO_1

我想要实现的目标

  • 执行操作如果有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

但它擦除了程序参数 我还缺少其他好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

if [ -n "$(ls -d foo_*)" ]; then ...如果您想进行更多类似正则表达式的匹配,可以shopt -s extglob然后与ls foo_+([0-9])匹配。

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

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