文件夹中的文件计数显示不准确



我正在编写一个shell脚本,以便一次检查两件事。第一个条件是检查特定文件的存在,第二个条件是确认该目录中只有一个文件。

我正在使用以下代码:

conf_file=ls -1 /opt/files/conf.json 2>/dev/null | wc -l 
total_file=ls -1 /opt/files/* 2>/dev/null| wc -l
if [ $conf_file -eq 1 ] && [ $total_file -eq 1 ]
then
echo "done"
else
echo "Not Done"
fi

它返回以下错误

0
0
./ifexist.sh: 4: [: -eq: unexpected operator
Not Done

我可能犯了一个非常愚蠢的错误。有人能帮我一点忙吗?

通常不应该解析ls的原因之一是,当文件带有换行符时,可能会得到奇怪的结果。在您的情况下,这不会是一个问题,因为任何不同于json.conf的文件都会导致测试失败。但是,您应该使计算文件的代码经得起将来的考验。您可以使用find

您的代码可以更改为

jsonfile="/opt/files/conf.json"
countfiles=$(find /opt/files -maxdepth 1 -type f -exec printf '.n' ; | wc -l)
if [[ -f "${jsonfile}" ]] && (( "${countfiles}" == 1)); then
echo "Done"
else
echo "Not Done"
fi 

当你这样说时:

conf_file=ls -1 /opt/files/conf.json 2>/dev/null | wc -l

它将值";ls〃;然后尝试运行一个名为"conf_file"的命令-1〃;并通过管道将结果发送到wc如果要运行管道序列,则必须将其包含在$((:中

conf_file=$(ls -1 /opt/files/conf.json 2./dev/null | wc -l)

接下来,当组合test命令([(中的子句时,在命令内部执行:

if [ $conf_file -eq 1 -a $total_file -eq 1 ]

然而,有更好的方法可以做到这一点。您可以检查是否存在一个带有"的文件-f";,您只需检查ls的输出是否符合预期,而无需创建变量或运行其他命令:

if [ -f /opt/files/conf.json -a "$(ls /opt/files/conf.*)" -eq "/opt/files/conf.json" ]

但是,禁止其他文件不是一种友好的做法。在许多情况下,人们可能希望保留备份或测试副本(conf.json.bak或conf.json.test(,而您没有理由阻止它。

最新更新