在shell/bash中使用单个会话列出递归FTP目录(使用cURL或FTP)

在shell/bash中使用单个会话列出递归FTP目录(使用cURL或FTP),bash,session,shell,ftp,curl,Bash,Session,Shell,Ftp,Curl,我正在编写一个小shell脚本,它需要遍历ftp服务器上的所有文件夹和文件(递归)。到目前为止,使用cURL一切都很好,但速度相当慢,因为cURL会为每个命令启动一个新会话。因此,对于500个目录,cURL将执行500次登录 有谁知道,我是否可以使用cURL(这将是我最喜欢的解决方案)保持登录状态,或者如何在shell脚本中只使用一个会话的ftp 我知道如何执行一组ftp命令并检索响应,但对于递归列表,它必须更具动态性 谢谢你的帮助 如果您只想创建所有文件和文件夹的列表,可以使用ssh。类似这样

我正在编写一个小shell脚本,它需要遍历ftp服务器上的所有文件夹和文件(递归)。到目前为止,使用cURL一切都很好,但速度相当慢,因为cURL会为每个命令启动一个新会话。因此,对于500个目录,cURL将执行500次登录

有谁知道,我是否可以使用cURL(这将是我最喜欢的解决方案)保持登录状态,或者如何在shell脚本中只使用一个会话的ftp

我知道如何执行一组ftp命令并检索响应,但对于递归列表,它必须更具动态性


谢谢你的帮助

如果您只想创建所有文件和文件夹的列表,可以使用
ssh
。类似这样的内容(但请查看有关正确用法的文档)


您可以通过ftp服务器接受来自stdin的命令并写入stdout的方式连接到ftp服务器。创建两个命名管道(“FIFO”,
manmkfifo
),将ftp命令的stdin和stdout重定向到其中一个管道。然后,您可以将命令写入标准输入法连接的fifo,并从标准输入法fifo读取命令(例如,使用bash的
read
逐行读取)。然后使用结果查看需要向何处发送另一个listing命令(并打印它或执行任何您想执行的操作)


简言之:bash脚本不适用于以下内容:)(当然,除非您找到一个能够自己完成任务的工具)

该命令实际上是
ncftpls-R
。它将递归列出ftp文件夹中的所有文件。

如果可能,请尝试使用Sign lftp脚本:

# lftp script "myscript.lftp"
open your-ftp-host
user username password
cd directory_with_subdirs_u_want_to_list
find
exit
接下来您需要的是bash脚本来运行此lftp命令并将其写入文件:

#!/bin/bash
lftp -f myscript.lftp > myOutputFile

myOutputFile现在包含完整的目录转储。

只是总结一下到目前为止其他人所说的内容。如果您试图编写一个作为批处理文件使用的可移植shell脚本,那么您需要使用lftp解决方案,因为它可能无法实现
ls-R
。在以下示例中,只需将123.456.789.100替换为ftp服务器的实际IP地址即可:

$ lftp -c "open 123.456.789.100 && find -l && exit" > listing.txt
请参阅lftp的
man
页面,转到
find
部分:

列出目录中的文件(默认情况下为当前目录) 递归地。这有助于解决缺少ls-R支持的服务器。你 可以重定向此命令的输出

但是,如果您有办法确定远程ftp服务器是否实现了对
ls-lR
的适当支持,那么更好(=更快)的解决方案将是:

$ echo ls -lR | ftp 123.456.789.100 > listing.txt

仅供参考,如果我执行第一个命令(lftp+find),则需要0m55.384s来检索完整列表,而如果我执行第二个命令(ftp+ls-R),则需要0m3.225s。

这并不能真正回答问题。我们不知道他有空壳权限。这应该是一个注释。
lftp
解决方案实际上可以与Windows FTP服务器一起使用,即使已删除对
ls-R
的支持:。谢谢已发现某些FTP服务器不支持此方法。
$ echo ls -lR | ftp 123.456.789.100 > listing.txt