特定のPNGファイルに対して3つのディレクトリを確認するスクリプトがあります。最初はローカルで、最初に確認されます。 2つ目は、ローカルハードドライブでファイルが利用できない場合にのみ確認されるリモート共有です。場合によっては、3番目のディレクトリ(アーカイブディレクトリ)からファイルを繰り返し検索します。
何らかの理由で、私のif / elif / fi設定の2番目の部分は機能しません。 PNGファイルが間違いなく利用可能であるにもかかわらず、なぜPNGファイルが見つからないのかわかりません。オタとすべての変数を再確認し、そこにログステートメントを追加しました。最後の試みは、より多くのログメッセージを得るために「ファイル」と「0バイトより大きい」評価を分離することでした。ファイルを手動で検索すると(検索またはファイルマネージャを使用して)すぐに検索できますが、スクリプトでは見つかりません。
しかし、最初と3番目の部分はうまく機能します。私はちょっと問題があり、私のスクリプトがファイルを見つけることができない理由がわかりません。誰でも私を助けることができますか?
これは私のコードです。
#!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 ]
testをに置き換えます[ -e file ]
。