我正在编写一个shell脚本来自动执行从远程oracle数据库中提取数据的任务,并将其临时存储在本地机器中的Csvfoder文件夹中。我使用'expect'命令将此Csv文件夹中的所有文件复制到ftp服务器。
Csv文件夹中的这些csv文件具有特定的名称(在下面的示例中,时间戳记有两个连接的系统时间戳) -
例如,从oracle Table1中提取的数据将具有名称ABCD。(timestamp1).csv,在15分钟后脚本再次运行之后,Csvfolder可能具有从oracle中提取的另一个文件Table1将具有名称ABCD。(timestamp2 )的.csv
从oracle Table2中提取的数据将具有名称,例如XYZ。(timestamp10).csv,在15分钟后脚本再次运行之后,Csvfolder可能具有从oracle中提取的另一个文件Table2将具有名称XYZ。(timestamp11)的.csv
现在我的脚本只是使用expect将Csv文件夹中的所有* .csv文件上传到FTP服务器。
但我有一个csv文件名映射到csv文件应该去的FTP服务器上的某些特定目录 -
从上面的示例中,我希望将所有ABCD。(timestampxx).csv文件从本地计算机复制到FTP文件夹HOME_FOLDER / FOLDER_NAME1(唯一文件夹名称)。 我希望将所有XYZ。(时间戳).csv文件从本地计算机复制到FTP文件夹HOME_FOLDER / FOLDER_NAME2(唯一文件夹名称)。在这个例子中,我将有映射:
ABCD files -> should go to HOME_FOLDER/FOLDER_NAME1 of FTP server
XYZ files -> should go to HOME_FOLDER/FOLDER_NAME2 of FTP server
我现在正在shell脚本中使用mput:
expect -c '
set username harry
set ip 100.132.123.44
set password sally
set directory /home/harry
set csvfilesFolder /Csvfolder/
spawn sftp $username@$ip
#Password
expect "*password:"
send "$password\n"
expect "sftp>"
#Enter the directory you want to transfer the files to
send "cd $directory\n"
expect "sftp>"
send -r "mput $csvfilesFolder*\n"
expect "sftp>"
send "exit\n"
interact'
有关如何使用映射将本地计算机上的csv文件复制到FTP服务器上的特定目录的任何建议吗?
答案 0 :(得分:1)
而不是:
send -r "mput $csvfilesFolder*\n"
你想要
# handle ABCD files
send "cd $directory/FOLDER_NAME1\r"
expect "sftp>"
send "mput $csvfilesFolder/ABCD.*.csv\r"
expect "sftp>"
# handle XYZ files
send "cd $directory/FOLDER_NAME2\r"
expect "sftp>"
send "mput $csvfilesFolder/XYZ.*.csv\r"
expect "sftp>"
通常情况下,我会使用\r
来模拟"点击输入",但我猜\n
有效。
使用expect eof
代替interact
来结束期望脚本。