bash上传到sftp和移动文件。循环

时间:2015-01-28 13:02:15

标签: bash loops sftp

我在bash脚本中有点初学者。我这里有一些脚本,可以将文件上传到sftp服务器。然后它将文件移动到其他目录。 否则回显有关source_dir中没有文件的信息。问题是它没有移动文件,并且在文件已经上传后循环回到sftp登录。

cd /dest_dir/
    for file5 in *.test
            do
                if test -f $file5
                then
                    echo 'some text.'
                    ((
                      echo "
    cd /dest_dir/
    lcd /source_dir/
    mput *.test
    exit
                        "
                    ) | sftp "user"@"host")

                    sleep 3 
                    mv /source_dir/$file5 /source_dir/test/
                else
                    echo -e 'some text'
                fi

2 个答案:

答案 0 :(得分:0)

通常没有理由检查您正在循环的文件是否确实存在。如果某个文件可能会在fortest之间消失,那么它也可能会在testecho之间消失,在这种情况下,您最终会引用一个不再存在的文件。

#!/bin/bash
shopt -s nullglob   # bash-only feature
cd /dest_dir/
(#echo "cd /dest_dir/"  # no use, you already did above
echo "lcd /source_dir/"
for file in *.test; do
    echo put "$file"
done
echo "exit" ) | sftp "user"@"host"
mv *.test /source_dir/test/

这会为所有文件打开一个scp连接。它有一个明显的缺点,如果其中一个文件由于某种原因失败,脚本就不会捕获它。

除了shopt -s nullglob之外,这通常可以移植到Bourne shell。

答案 1 :(得分:0)

谢谢您的提示。我做到了:登录:

SFTP_HOST="host"
SFTP_LOGIN="USER"
cd /path/
mylog=/path/sftp_session_$(date "+%Y_%m_%d").log
echo "$(date "+%Y-%m-%d %H:%M:%S") - text" >> $mylog
let licz5=`ls|wc -l`
let jest_plik=0
for file5 in *.test
do
    if test -f /patch_source1/$file5
    then
        let jest_plik=1
        echo "$(date "+%H:%M:%S") - transfer pliku "$file5" na serwer "$SFTP_HOST >> $mylog
    fi

    if test -f /source_patch2/$file6
    then
        echo "$(date "+%H:%M:%S") - transfer pliku "$file6" na serwer "$SFTP_HOST >> $mylog
    fi

    if test -f /source_patch3/$file7
    then
        echo "$(date "+%H:%M:%S") - transfer pliku "$file7" na serwer "$SFTP_HOST >> $mylog
    fi

    if test -f /source_patch4/$file8
    then
        echo "$(date "+%H:%M:%S") - transfer pliku "$file8" na serwer "$SFTP_HOST >> $mylog
    fi
done
if test $jest_plik -eq 1
then
echo 'text.'
(echo 'cd /dest_dir/
lcd /source_p_1/
mput *.test
lcd /source_p_2/
mput *.test
lcd /source_p_3/
mput *.test
lcd /source_p_4/
mput *.test
exit') | sftp $SFTP_LOGIN@$SFTP_HOST
echo "$(date "+%H:%M:%S") - send ok." >> $mylog
else
echo -e 'text'
fi