我正在尝试检查文件是否存在,但是带有通配符。这是我的示例:
if [ -f "xorg-x11-fonts*" ]; then
printf "BLAH"
fi
我也尝试过不使用双引号。
更新:对于bash脚本,最直接,最有效的方法是:
if compgen -G "${PROJECT_DIR}/*.png" > /dev/null; then
echo "pattern exists!"
fi
即使在包含数百万个文件的目录中,这也将非常迅速地工作,并且不涉及新的子shell。
最简单的方法应该是依靠ls
返回值(当文件不存在时,它返回非零):
if ls /path/to/your/files* 1> /dev/null 2>&1; then
echo "files do exist"
else
echo "files do not exist"
fi
我重定向了ls
输出,使其完全静音。
编辑:由于此答案引起了关注(并且评论家的评论非常有用,为评论),因此,这是一种优化,它也依赖于glob扩展,但是避免了使用ls
:
for f in /path/to/your/files*; do
## Check if the glob gets expanded to existing files.
## If not, f here will be exactly the pattern above
## and the exists test will evaluate to false.
[ -e "$f" ] && echo "files do exist" || echo "files do not exist"
## This is all we needed to know, so we can break after the first iteration
break
done
这与@ grok12的答案非常相似,但是它避免了整个列表的不必要迭代。
一个警告:在Debian和Ubuntu中
dash
安装的Debian Almquist Shell()/bin/sh
中,&>
似乎丢弃了退出代码,这破坏了该解决方案。一种解决方法是> /dev/null 2>&1
改用重定向。ls
在包含许多文件的目录上可能会非常慢(可能是由于排序)。您可能需要-U
至少关闭与的排序。@CostiCiudatu您是否检查了当目录名称中有空格时,该替代方法是如何工作的?会不会如
for f in /path/to/your files*
解释为两个参数,/path/to/your
和files*
?我试过用双引号引起来,但没有成功(即使有文件,也找不到文件)。@Izzy,应该将其用双引号引起来,但请放到
*
外面:for f in "/path/to/your files"*
应该起作用。警告。如果目录包含很多文件,则此操作将失败。扩展名“ *”将超过命令行长度限制。