![如何使用sftp放置多个文件](https://linux22.com/image/166530/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8sftp%E6%94%BE%E7%BD%AE%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
需要您的帮助将多个文件放入服务器中。我已经创建了一个脚本,但它没有放置所有文件
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
之后插入类似的内容到管道中。如果您想附加到现有日志文件而不是覆盖它,请使用find
cut
tee -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