我有一个脚本可以在运行之前检查传输文件,但即使我知道有传输文件的事实,它也会运行。似乎"cmp"操作无法正常工作。我需要确保在文件完成传输之前我没有抓取任何文件。代码如下:
different=1
compare1=~/Desktop/$$-testing1.txt
compare2=~/Desktop/$$-testing2.txt
waittime=10s
DATE=$(date +%Y%m%d)
PRO="/Volumes/pubfiles/ConversionRequests/Processed"
DATEI=$(date +-%m-%d-%Y)
cd $PRO/Processed$DATEI
echo Checking if files are in process in ${PWD}...
while [ $different -eq 1 ]; do
ls -la@ 1> $compare1
sleep $waittime
ls -la@ 1> $compare2
if cmp $compare1 $compare2 ; then
echo Files have not changed in $waittime. Continuing...
different=0
else
echo Files are still being transferred. Waiting $waittime...
fi
done
rm $compare1
rm $compare2
你的方法可能行不通。若要确保读取的文件不是其他进程当前正在写入的文件,请让进程使用临时名称写入文件。完成后,让它重命名文件。
然后,您可以简单地忽略临时文件名。
如果您使用家庭编写的脚本来传输文件,请将其替换为适当的传输工具,例如 rsync(1)
.
如果您使用的是商业产品,请提交错误。如果他们拒绝修复它,那么他们可能不知道他们在做什么 - 找到更好的产品。
更改:
ls -la
自:
du -sk
似乎问题在于ls -la
只会列出存在的目录,而不是它们各自的字节大小,因此 cmp 文件将始终相同。通过使用:
du -sk
您获得目录的大小,while 循环将继续按预期进行。