您将如何使用bash判断目录中是否存在特定扩展名的文件?
就像是
if [ -e *.flac ]; then
echo true;
fi
Answers:
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
ls -l
,我的答案使用的是ls -1
ls -1
会为每个文件打印一行
\n
(是的,在文件名中有效)。
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
${#myarray[@]}
等于1
ls -1 *.py
而不是查找来简化
它使用ls(1),如果不存在flac文件,则ls报告错误,脚本退出;否则脚本将继续执行,并且文件可能会被处理
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
if ls *.flac >/dev/null 2>&1; then ... fi;
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
你需要小心翼翼地扔到你的旗帜上 if
声明中使用,以及它与所需结果的关系。
如果您只想检查常规文件,而不要检查其他类型的文件系统条目,则需要将代码框架更改为:
if [ -f file ]; then
echo true;
fi
使用-f
限制将if
常规文件限制为常规文件,但-e
扩展性更强,并且将匹配所有类型的文件系统条目。当然,还有其他选项,例如-d
目录等。请参见http://tldp.org/LDP/abs/html/fto.html以获得良好的列表。
正如@msw指出的那样,如果您尝试为它提供多个参数,则test
(即[
)将会阻塞。如果您的glob*.flac
返回多个文件,则可能会发生这种情况。在这种情况下,请尝试将if
测试包装成一个循环:
for file in ./*.pdf
do
if [ -f "${file}" ]; then
echo 'true';
break
fi
done
这样,您break
就可以在想要的文件扩展名的第一个实例上继续进行脚本的其余部分。
test
(aka [
)抱怨模式是否扩展到多个文件:“期望二进制运算符”或“参数过多”
"$file"
,因为文件名可能包含一些不良字符,例如空格或星号。
最佳解决方案(if [ -e *.flac ];)
对我不起作用,给出:[: too many arguments
if ls *.flac >/dev/null 2>&1;
那么它将起作用。
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
-ge
不是而是要使用-gt
,因为否则您的代码将无法检测到单个文件。其次,如果没有文件匹配该模式,则任何符合条件的shell都会使该字符串*.ext
保持不变,因此您仍然会得到一个“结果”。
您可以使用-f检查特定类型的文件是否存在:
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
[
(而不是更常见的[[
)不能防止乱码。