Bash:使用FTP检查远程目录是否存在

Bash:使用FTP检查远程目录是否存在,bash,ftp,Bash,Ftp,我正在编写一个bash脚本,将文件从linux服务器发送到远程Windows FTP服务器。 在尝试创建文件之前,我想使用FTP检查存储文件的文件夹是否存在。 请注意,我不能使用SSH或SCP,也不能在linux服务器上安装新脚本。另外,对于性能问题,我更希望只使用一个FTP连接来检查和创建文件夹 以下是发送文件的函数: sendFile() { ftp -n $FTP_HOST <<! >> ${LOCAL_LOG} quote USER ${F

我正在编写一个bash脚本,将文件从linux服务器发送到远程Windows FTP服务器。 在尝试创建文件之前,我想使用FTP检查存储文件的文件夹是否存在。 请注意,我不能使用SSH或SCP,也不能在linux服务器上安装新脚本。另外,对于性能问题,我更希望只使用一个FTP连接来检查和创建文件夹

以下是发送文件的函数:

sendFile() {
    ftp -n $FTP_HOST <<! >> ${LOCAL_LOG}
        quote USER ${FTP_USER}
        quote PASS ${FTP_PASS}
        binary
        $(ftp_mkdir_loop "$FTP_PATH")
        put ${FILE_PATH} ${FTP_PATH}/${FILENAME}
        bye
!
}
ftp\u mkdir\u循环
功能有助于在
$ftp\u路径
中创建所有文件夹(因为我无法通过ftp执行
mkdir-p$ftp\u路径

总的来说,我的脚本可以工作,但不“干净”;这是脚本执行后我在日志文件中得到的内容(是的,
$FTP\u PATH
由5个现有目录组成):


要解决此问题,请执行以下操作:

  • 要确保只使用一个FTP连接,请将输入(FTP命令)创建为shell脚本的输出

    例如

  • 要允许FTP测试目录是否存在,可以使用“DIR”命令具有写入文件选项这一事实

     # ...continuing a.sh
     # In a loop, $CURRENT_DIR is the next subdirectory to check-or-create
     echo "DIR $CURRENT_DIR $local_output_file" 
     sleep 5 # to leave time for the file to be created
     if (! -s $local_output_file)
     then
        echo "mkdir $CURRENT_DIR"
     endif
    
    请注意,
    “-s”
    测试不一定正确-我现在没有ftp访问权限,也不知道在不存在的目录上运行DIR的确切输出是什么-cold可能是空文件,可能是特定错误。如果出现错误,您可以在$local\u output\u文件中grep错误文本

  • 现在,将步骤#2封装到a.sh中单个子目录的循环中


  • 这里的建议是,他应该对每个目录组件执行一个ftp连接以使用
    cd
    进行测试,然后对每个不存在的组件执行一个ftp连接以使用
    mkdir
    ,然后再执行一个ftp连接以传输文件?创造性回答使用
    $PIPESTATUS
    检查ftp中的错误。但在@EtanReisner的评论之后,似乎会有太多的FTP连接。此外,我最终希望检查文件夹是否存在,并仅使用一个FTP连接创建它们。如果没有更好的答案,我将在期末奖励您,因为我刚刚了解了
    $PIPESTATUS
    ,您的第二个答案(我们仅抑制邮件)令人满意,尽管没有完全回答我的问题问题。@很遗憾,我不知道有什么方法可以通过ftp测试目录而不触发错误(从
    mkdir
    cd
    )我也不知道有什么方法可以在ftp会话中测试/捕获该错误,因此当与原始代码一起使用时,选择性静默可能是最好的方法。具有讽刺意味的是,sftp不支持写入本地文件,因此此解决方案仅适用于纯ftpI,而无法实现此解决方案。你能详细说明一下吗?我对bash脚本还不是很在行。我在执行
    DIR$CURRENT\u DIR$local\u output\u file
    时得到了
    ?无效的命令
    ,$local\u output\u file到底是什么?@grim-这是我编造的一个变量,用来保存所需文件的名称,将DIR的输出保存在那里。顺便说一下,在不存在的目录上运行
    DIR
    的输出不会创建/更新本地输出文件。
    (directory-name) Cannot create a file when that file already exists.
    Cannot create a file when that file already exists.
    Cannot create a file when that file already exists.
    Cannot create a file when that file already exists.
    Cannot create a file when that file already exists.
    
        #!/bin/bash
    
        FTP_HOST=prep.ai.mit.edu
        FTP_USER=anonymous
        FTP_PASS=foobar@example.com
        DIRECTORY=/foo                   # /foo does not exist, /pub exists
        LOCAL_LOG=/tmp/foo.log
        ERROR="Failed to change directory"
    
        ftp -n $FTP_HOST << EOF | tee -a ${LOCAL_LOG} | grep -q "${ERROR}"
        quote USER ${FTP_USER}
        quote pass ${FTP_PASS}
        cd ${DIRECTORY}
        EOF
    
        if [[ "${PIPESTATUS[2]}" -eq 1 ]]; then
          echo ${DIRECTORY} exists
        else
          echo ${DIRECTORY} does not exist
        fi
    
    /foo does not exist
    ftp -n $FTP_HOST <<! | grep -v "Cannot create a file" >> ${LOCAL_LOG}
    
    $ cat a.sh
    cd /home/test1
    mkdir /home/test1/test2
    
    $ ./a.sh | ftp $Your_login_and_server > /your/log 2>&1
    
     # ...continuing a.sh
     # In a loop, $CURRENT_DIR is the next subdirectory to check-or-create
     echo "DIR $CURRENT_DIR $local_output_file" 
     sleep 5 # to leave time for the file to be created
     if (! -s $local_output_file)
     then
        echo "mkdir $CURRENT_DIR"
     endif