Я использую этот bash -код для загрузки файлов на удаленный сервер, для нормальных файлов это прекрасно работает:
for i in `find devel/ -newer $UPLOAD_FILE`
do
    echo "Upload:" $i
    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh [email protected]$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i [email protected]$SERVER:$REMOTE_PATH/$i
    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp
    fi
done
Единственная проблема заключается в том, что для файлов с пробелом в имени, for-loop терпит неудачу, поэтому я заменил первую строку следующим образом:
find devel/ -newer $UPLOAD_FILE | while read i
do
    echo "Upload:" $i
    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh [email protected]$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i [email protected]$SERVER:$REMOTE_PATH/$i
    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp
    fi
done
По какой-то странной причине ssh-команда вырывается из цикла while, поэтому первый недостающий каталог создается отлично, но все последующие отсутствующие файлы/каталоги игнорируются.
Я предполагаю, что это связано с тем, что ssh пишет что-то в stdout, что смущает команду "читать". Комментируя ssh-команду, цикл работает так, как должен.
Кто-нибудь знает, почему это происходит, и как можно предотвратить ssh от нарушения цикла while?