在 unix 中使用 SFTP 获取文件大小和名称的干净列表

Get clean list of file sizes and names using SFTP in unix

我想从使用 SFTP 的服务器中逐一获取小于 1 GB 的文件列表。

我是运行以下命令:

$sftp -oIdentityFile=/home/user/.ssh/id_rsa -oPort=22 user@hostname >list.txt <<EOF
cd upload/Example
ls -l iurygify*.zip
EOF

这导致:

$cat list.txt
sftp> cd upload/Example
sftp> ls -l iurygify*.zip
-rwxrwx---    0 300096661 300026669        0 Mar 11 16:38 iurygify1.zip
-rwxrwx---    0 300096661 300026669        0 Mar 11 16:38 iurygify2.zip

然后我可以使用 awk 计算获取大小和文件名,我可以将其保存到日志中以供参考,然后仅下载满足 1 GB 标准的文件。

有没有更简单的方法来完成获取此文件列表和大小?我想避免 list.txt 中的提示和命令的垃圾整体,并且不想通过 expect 命令执行此操作。

我们正在使用 SSH 密钥身份验证

也许使用 lftp 而不是 sftp

$ lftp sftp://xxx > list.txt <<EOF
> open
> ls -l
> EOF
$ cat list.txt
drwxr-xr-x   10 ludo     users        4096 May 24  2019 .
drwxr-xr-x    8 root     root         4096 Dec 20  2018 ..
-rw-------    1 ludo     users       36653 Mar 31 19:28 .bash_history
-rw-r--r--    1 ludo     users         220 Mar 21  2014 .bash_logout
-rw-r--r--    1 ludo     users         362 Aug 16  2018 .bash_profile
...

您可以将 sftp commands 放入 批处理文件 并过滤输出 - 不需要 expect.

echo 'ls -l' > t
sftp -b t -oIdentityFile=/home/user/.ssh/id_rsa -oPort=22 user@hostname | grep -v 'sftp>' >list.txt

或者更进一步,在同一步骤中筛选出“合适的尺寸”:

sftp -b t -oIdentityFile=/home/user/.ssh/id_rsa -oPort=22 user@hostname | awk '!~/sftp>/&&<1000000000' >list.txt