J'utilise ce code bash pour télécharger des fichiers vers un serveur distant, pour des fichiers normaux cela fonctionne bien :
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
Le seul problème est que pour les fichiers dont le nom contient un espace, la boucle for échoue, j'ai donc remplacé la première ligne par celle-ci :
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
Pour une raison étrange, la commande ssh sort de la boucle while, ce qui fait que le premier répertoire manquant est créé sans problème, mais que tous les fichiers/répertoires manquants suivants sont ignorés.
Je suppose que cela a quelque chose à voir avec le fait que ssh écrit quelque chose sur stdout, ce qui perturbe la commande "read". En commentant la commande ssh, la boucle fonctionne comme elle le devrait.
Quelqu'un sait-il pourquoi cela se produit et comment on peut empêcher ssh de casser la boucle while ?