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