如何使用sftp放置多个文件

如何使用sftp放置多个文件

需要您的帮助将多个文件放入服务器中。我已经创建了一个脚本,但它没有放置所有文件

cd /buffer/miscellaneous/new/
cd $(ls -t | head -n 1)
latest=$(find -mmin -60 | cut -d'/' -f2 | tail -n +2 | tr '\n' '\t')
/usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1 << 1
mput $latest*
bye

对于这个命令

find -mmin -60 | cut -d'/' -f2 | tail -n +2 | tr '\n' '\t'

输出是 2 个 csv 文件:

cgi_20111210_235524.csv cgi_20203127_125504.csv

现在的问题是mput只放置第一个文件而不放置其他文件。

find命令的输出结果如下

find -mmin -60
.
./cgi_20110911_135504.csv
./cgi_20111210_235524.csv
./cgi_20203127_125504.csv

答案1

可以通过添加仅查找文件而不是目录来省略在输出中cut -d'/' -f2跳过行的命令。.find-type f

cut -d'/' -f2如果子目录中有文件,该命令将不会产生文件名,sftp在这种情况下, for 命令也不起作用。所以我建议限制 的深度find

sftp我建议为打印的文件名创建单独的命令,find并将其通过管道传输到您的sftp命令中。

{ find -maxdepth 1 -type f -mmin -60| cut -d'/' -f2 | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1

要查看为您创建了哪些命令,sftp可以省略该部分| /usr/local/bin/sshpass...

编辑

要记录文件名,您可以在or命令tee logfile之后插入类似的内容到管道中。如果您想附加到现有日志文件而不是覆盖它,请使用findcuttee -a logfile

例子:

{ find -maxdepth 1 -type f -mmin -60 | cut -d'/' -f2 | tee logfile | sed 's/^/put /' ; echo bye ; } | /usr/local/bin/sshpass -p password sftp -oBatchMode=no [email protected]:/folder1

答案2

确定您的sftp版本提供该mput命令吗?它没有在sftp我最近搜索的任何手册页中列出;我想他们可能会出于向后兼容性的原因接受它作为命令的“别名” put,而该命令本身又可以传输多个文件。man sftp:

[-afPpr]本地路径 [远程路径]

上传本地路径并将其存储在远程计算机上。如果未指定远程路径名,则其名称与本地计算机上的名称相同。 local-path 可能包含 glob(7) 字符并且可能匹配多个文件。

如果有两个参数,( m)put使用第二个参数作为目标文件名,因此仅传输一个文件。任何其他参数都将被忽略:

sftp> mput 文件1 文件2

正在上传 file1 到 /user/TMP/file2
file1
100% 48 1.9KB/s 00:00

您可能需要考虑对多个非全局文件sftp的批处理模式。put

相关内容