Bash 在 SFTP 脚本之后使用 ssconvert 将 .xlsx 文件批量转换为 csv 文件的脚本

Bash script to Batch convert .xlsx files to csv files using ssconvert after SFTP script

下面的命令在命令行模式下工作得很好

find . -maxdepth 1 -name "*.xlsx" -exec ssconvert {} --export-type=Gnumeric_stf:stf_csv \;

但是在 SFTP 下载代码后在 Bash 脚本文件中添加相同内容时,它没有执行。请帮忙。谢谢!

Bash 脚本代码 -

/usr/bin/expect<<EOD

spawn /usr/bin/sftp -o Port=${PORT} username@hostname
expect "password:"
send "$Pass_Pwd\r"
expect "sftp>"
send "lcd ${Src_Dir}\r"
expect "sftp>"
send "mget ${File1}\r"
expect "sftp>"
send "mget ${File1}\r"
expect "sftp>"
send "bye\r"
EOD
echo "Download done"


find . -maxdepth 1 -name "*.xlsx" -exec ssconvert {} --export-type=Gnumeric_stf:stf_csv \;

使用 find 可能会导致未执行的内容,因为它可能会产生不继承父变量的子进程。 从我在您的代码中看到的情况来看,这不应该发生,但是:

  • 使用“./”作为目录很容易出错,尤其是当您 运行 通过 cron
  • 该脚本时
  • 在查找命令中使用 -name ".xlsx" 可能会跳过大写文件,这些文件恰好在涉及最终用户时存在
  • 在 find 中使用 while 循环将允许稍后扩展您的脚本,而不必担心传递变量以查找子进程

无论如何,这里有一个您可能想要编码的强化示例:

workdir = /data/ftpdownloads
cd "$workdir" || { echo 'Failed to chdir into $workdir' ; exit 1; }

# Insert your expect script here

while IFS= read -r -d $'[=10=]' file; do
    ssconvert "$file" --export-type=Gnumeric_stf:stf_csv
done < <(find "$workdir" -type f -iname "*.xlsx" -print0)

免责声明:与 bash 一起使用 :)