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

时间:2014-12-01 16:54:05

标签: bash ftp

我正在编写一个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_mkdir_loop的样子:

ftp_mkdir_loop() {
    local r
    local a
    r="$@"
    while [[ "$r" != "$a" ]]; do
      a=${r%%/*}
      echo "mkdir $a"
      echo "cd $a"
      r=${r#*/}
    done
}

ftp_mkdir_loop功能有助于在$FTP_PATH中创建所有文件夹(因为我无法通过FTP执行mkdir -p $FTP_PATH)。

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

(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.

2 个答案:

答案 0 :(得分:1)

    #!/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

<小时/> 如果您只想抑制${LOCAL_LOG}中的消息:

ftp -n $FTP_HOST <<! | grep -v "Cannot create a file" >> ${LOCAL_LOG}

答案 1 :(得分:1)

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

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

    E.g。

    $ cat a.sh
    cd /home/test1
    mkdir /home/test1/test2
    
    $ ./a.sh | ftp $Your_login_and_server > /your/log 2>&1
    
  2. 要允许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的确切输出是什么 - 冷是空文件,可能是一个特定的错误。如果出现错误,您可以grep $ local_output_file

  3. 中的错误文本
  4. 现在,将步骤#2包装到a.sh中各个子目录的循环中