Bash:使用FTP检查远程目录是否存在
我正在编写一个bash脚本,将文件从linux服务器发送到远程Windows FTP服务器。 在尝试创建文件之前,我想使用FTP检查存储文件的文件夹是否存在。 请注意,我不能使用SSH或SCP,也不能在linux服务器上安装新脚本。另外,对于性能问题,我更希望只使用一个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
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个现有目录组成):
要解决此问题,请执行以下操作:
# ...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错误文本这里的建议是,他应该对每个目录组件执行一个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