Bash:检查是否存在使用FTP的远程目录
我在写一个bash脚本来将文件从linux服务器发送到远程Windows FTP服务器。 我想检查使用FTP,如果文件将被存储的文件夹存在之前尝试创建它。 请注意,我不能使用SSH和SCP,也无法在Linux服务器上安装新脚本。另外,对于性能问题,我更希望如果仅使用一个FTP连接检查和创建文件夹。Bash:检查是否存在使用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="[email protected]"
while [[ "$r" != "$a" ]]; do
a=${r%%/*}
echo "mkdir $a"
echo "cd $a"
r=${r#*/}
done
}
的ftp_mkdir_loop
功能在$FTP_PATH
创建所有的文件夹可以帮助(因为我不能做mkdir -p $FTP_PATH
通过FTP)。
总的来说,我的脚本工作,但不是“干净”;这就是我得到在我的日志文件中的脚本执行后(是的,$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.
为了解决这个问题,请执行以下操作:
-
要确保你只使用一个FTP连接,您创建输入(FTP命令)作为shell脚本的
例如输出
$ cat a.sh cd /home/test1 mkdir /home/test1/test2 $ ./a.sh | ftp $Your_login_and_server > /your/log 2>&1
-
要允许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"
测试不一定正确 - 我现在没有acccess to ftp,也不知道在非现有目录上运行DIR的确切输出是什么 - cold是空文件,可能是一个特定的错误。如果错误,你可以grep在$ local_output_file错误文本现在 ,包裹步骤#2成一个圈在你的个人子目录a.sh
#!/bin/bash
FTP_HOST=prep.ai.mit.edu
FTP_USER=anonymous
[email protected]
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}
是建议在这里,他应该被执行每个目录组件使用'cd'测试一个ftp连接,然后每个不存在的组件使用'mkdir',然后再传输一个文件? – 2014-12-26 12:34:21
使用'$ PIPESTATUS'检查FTP中的错误的创意答案。但是在@EtanReisner评论之后,似乎会有太多的FTP连接。此外,我最终想检查文件夹的存在,并创建它们只有一个FTP连接。 – grim 2014-12-27 18:37:17
如果没有更好的答案,因为我刚刚了解了“$ PIPESTATUS”,而且我们仅仅抑制消息的次要答案令人满意,但我并不完全回答我的问题,所以如果没有更好的答案,我会在期末奖赏您的赏金。 – grim 2014-12-27 18:40:45
具有讽刺意味的是,sftp不支持写入本地文件,所以这个解决方案只适用于纯FTP ftp – DVK 2014-12-29 20:39:20
我无法实现这个解决方案。你能否详细说明一下?我仍然不是很多用bash脚本编写的。 – grim 2014-12-30 16:36:37
当我执行'DIR $ CURRENT_DIR $ local_output_file'时''无效的命令' $ local_output_file究竟是什么? – grim 2014-12-30 16:54:22