【问题标题】:bash upload to sftp and moving files. looping aroundbash 上传到 sftp 和移动文件。循环
【发布时间】:2015-03-27 09:30:21
【问题描述】:

我是 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

【问题讨论】:

  • 您正在循环访问 *.test 文件。在每个循环中,您上传所有*.test 文件,但您只移动单个文件($file5)。那看起来不对。但这可能不是主要问题。
  • 所以我从 mput *.test 更改为 put $file5。将在少数情况下进行测试。谢谢

标签: bash loops sftp


【解决方案1】:

通常没有理由检查您正在循环的文件是否确实存在。如果文件可能在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。

【讨论】:

    【解决方案2】:

    感谢您的提示。我做到了:通过日志记录:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 2013-05-07
      • 1970-01-01
      • 2014-07-26
      • 2014-03-10
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多