文件夹中的文件数显示不准确
File count in a folder not showing accurate
我正在编写一个 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
我可能犯了一个非常愚蠢的错误。谁能帮我一点忙?
当你这样说时:
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),您没有理由阻止它。
您通常不应解析 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
我正在编写一个 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
我可能犯了一个非常愚蠢的错误。谁能帮我一点忙?
当你这样说时:
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),您没有理由阻止它。
您通常不应解析 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