最佳答案
我使用 bash 代码将文件上传到远程服务器,对于普通文件,这个工作得很好:
for i in `find devel/ -newer $UPLOAD_FILE`
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
唯一的问题是,对于名称中带有空格的文件,for 循环将失败,因此我替换了第一行,如下所示:
find devel/ -newer $UPLOAD_FILE | while read i
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
由于某种奇怪的原因,ssh-command 从 while-loop 中断开,因此第一个缺少的目录被创建得很好,但是所有后续缺少的文件/目录都被忽略。
我猜这与 ssh 向 stdout 写入一些东西有关,这会混淆“ read”命令。注释掉 ssh-command 可以使循环正常工作。
有人知道为什么会发生这种情况以及如何防止 ssh 破坏 while 循环吗?