특정 PNG 파일에 대해 세 개의 디렉터리를 확인하는 스크립트가 있습니다. 첫 번째는 로컬이며 먼저 확인됩니다. 두 번째는 로컬 하드 드라이브에서 파일을 사용할 수 없는 경우에만 확인되는 원격 공유입니다. 어떤 경우에는 세 번째 디렉터리(아카이브 디렉터리)에서 파일을 반복적으로 검색합니다.
어떤 이유로 내 if / elif / fi 구성의 두 번째 부분이 작동하지 않습니다. PNG 파일이 확실히 사용 가능함에도 불구하고 왜 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 ]
test를 로 바꾸십시오 [ -e file ]
.