我有一个脚本可以检查三个目录中的特定 PNG 文件。第一个是本地的,首先被检查。第二个是远程共享,仅当文件在本地硬盘上不可用时才会检查。在某些情况下,第三个目录(存档目录)会递归搜索文件。
由于某些原因,我的 if / elif / fi 构造的第二部分不起作用。我根本不明白为什么找不到 PNG 文件,即使它肯定可用。我仔细检查了拼写错误和每个变量,并在各处添加了日志语句。最后一次尝试是将“是一个文件”和“大于 0 字节”的评估分开以获得更多日志消息。当我手动查找文件(使用“查找”或文件管理器)时,我可以立即找到它,但脚本找不到它。
然而,第一部分和第三部分工作正常,现在我有点陷入困境,我不知道为什么我的脚本找不到该文件。有人可以帮我吗?
这是我的代码:
#!bin/bash
[...snip...]
find $printjobtemp -type f -maxdepth 1 -iname $printjobsearch | \
while read filename
do
# check if file is > 0 Bytes
# skip if 0 bytes, process if larger than 0 bytes
if [ -s "$filename" ]
then
if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
then
# png is available & > 0 bytes -> move printjob to printjobdirectory
writelog " found $pngname in $pngdir"
# create a copy for the archive
fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile 2>&1`
writelog " cp $fileoperation"
# move printjob to printjobdir
fileoperation=`mv -fv $filename $printjobdir/$printjobfile 2>&1`
writelog " mv $fileoperation"
# if not in pngdir: check in pngtemp
elif [ -f "$pngtemp/$pngname" ]
then
writelog " found in $pngtemp/$pngname - checking size..."
if [ -s "$pngtemp/$pngname" ]
then
writelog " found $pngname in $pngtemp and size is >0"
# move png to pngdir
fileoperation=`mv -fv $pngtemp/$pngname $pngdir/$pngname 2>&1`
writelog " mv $fileoperation"
# create a copy for the archive
fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile 2>&1`
writelog " cp $fileoperation"
# move printjob to printjobdir
fileoperation=`mv -fv $filename $printjobdir/$printjobfile 2>&1`
writelog " mv $fileoperation"
fi
# png not in pngdir & pngtemp
# check if it is an old printjob (reprint) and search in pngarchive
elif [ $pngage -gt $pngthreshold ]
then
writelog " png not found and printjob is considered as \"old\" - checking $pngarchive"
pngarchivefile=`find $pngarchive -type f -iname $pngname -printf '%p\n' | sort | tail -n 1`
writelog " searchresult: $pngarchivefile"
# check if searchresult contains a value
if [ -n "$pngarchivefile" ]
then
# searchresult is not NULL -> move the png back to $pngdir
writelog " moving $pngarchivefile to $pngdir"
# move png to pngdir
fileoperation=`mv -fv $pngarchivefile $pngdir/$pngname 2>&1`
writelog " mv $fileoperation"
# create a copy for the archive
fileoperation=`cp -fv $filename $printjobdir/archive/$printjobfile 2>&1`
writelog " cp $fileoperation"
# move printjob to printjobdir
fileoperation=`mv -fv $filename $printjobdir/$printjobfile 2>&1`
writelog " mv $fileoperation"
else
# searchresult is NULL - complain about this and do nothing
writelog " $pngname not found in archive - this should be checked manually!"
fi
else
writelog " $pngname not existing or 0 Bytes - skipping $printjobfile"
# writelog " pngtemp: $pngtemp/$pngname"
fi
fi
done
[...snap...]
亲切的问候,
硬脑膜
答案1
你已经把你的if...fi
块搞混了。这是脚本的当前结构:
if [ -f "$pngdir/$pngname" ] && [ -s "$pngdir/$pngname" ]
then
elif [ -f "$pngtemp/$pngname" ]
then
if [ -s "$pngtemp/$pngname" ]
then
fi
elif [ $pngage -gt $pngthreshold ]
then
if [ -n "$pngarchivefile" ]
then
else
fi
else
fi
fi
正如你所看到的,你有一个额外的东西fi
。如果您没有收到语法错误,则最终结果fi
是结束脚本前一部分中的某些内容,因此,这可能不会按照您的想法进行。
另外,[ -f $pngname ]
检查目标是否是常规文件。如果您只是想检查它是否存在,并且确定如果存在,它肯定是一个文件而不是目录或其他什么,您可以跳过-f
并直接使用-s
。[ -s file ]
如果文件不存在则返回 false。
我无法确切地告诉您脚本失败的原因,因为您没有显示脚本的其余部分。如果您编辑问题并给出重现错误的最小工作示例,我可以更新此答案。另一种可能性是您的目标文件实际上是一个链接,在这种情况下,将会[ -f file ]
失败。如果您还需要它用于链接,请将[ -f file ]
测试替换为[ -e file ]
.