在文件夹中,我有两个(或更多)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
但它擦除了程序参数 我还缺少其他好的解决方案吗?
答案 0 :(得分:0)
对于几乎所有这些案例,我认为好的解决方案是在测试中使用ls
,因为它通常很简单:
if [ -n "$(ls -d foo_*)" ]; then ...
如果您想进行更多类似正则表达式的匹配,可以shopt -s extglob
然后与ls foo_+([0-9])
匹配。
还有一个使用多个shell选项的全bash解决方案,但它不容易记住,因此我将其留给另一张海报; - )
编辑:正如@Pesa所指出的那样,如果只有一个空的匹配目录,那么使用ls foo_*
将会失败,因为该目录的空内容将被列出并且ls foo_*
不会只匹配目录,因此最好使用-d
。