FTP 下载绝对路径列表

FTP 下载绝对路径列表

我有一个远程服务器上文件的绝对路径列表(几千个),需要将其下载到我的电脑上。

我还需要这些文件来保持这些文件的目录结构完整。

例子:

/* UNIX Server File-System  */
/home/username/
    stuff/
    more-stuff/
    data/
    file1.txt

/* Local Windows File-System After Transfer  */
C:\Users\username\Documents\home\username\
    stuff\
    more-stuff\
    data\
    file1.txt

理想情况下,我会使用某种类型的 FTP 将这些文件传输到我的电脑。但是,我不知道有哪个程序或 CLI 命令支持获取文件列表。我需要从特定目录中获取特定文件,我不能只下载整个目录。

我的问题:如何使用绝对路径列表自动将文件下载到本地主机?(同时保持目录结构完整)

此外,我将这些文件保存在 PHP 数组中。因此我可以将列表导出为 JSON、CSV、XML 等。

答案1

如果你介意的话你可以使用rsync类似

rsync -av --files-from=/path/yourlist.txt / remote:/backup

其中

  • /path/yourlist.txt 你可以把你的文件列表和完整路径放在一起
  • /添加到列表中的文件名的路径(如果它们是完整路径名/
  • remote:/backup远程主机名及其相对路径

--files-from您可以从[阅读更多内容man rsync 1]

--files-from=文件

Using this option allows you to specify the exact list of files to transfer (as
read from the specified FILE or - for standard input). It also tweaks the 
default  behavior of rsync to make transferring just the  specified files and 
directories  easier:
  • 隐含 --relative (-R) 选项,它保留了文件中每个项目指定的路径信息(如果要关闭此功能,请使用 --no-relative 或 --no-R)。
  • 隐含 --dirs (-d) 选项,它将在目标上创建列表中指定的目录,而不是嘈杂地跳过它们(如果您想关闭此功能,请使用 --no-dirs 或 --no-d)。
  • 这 - 存档(-a)选项的行为并不意味着--recursive(-r),因此如果您需要它,请明确指定它。
  • 这些副作用会改变 rsync 的默认状态,因此命令行上 --files-from 选项的位置与其他选项的解析方式无关(例如,-a 在 --files-from 之前或之后的工作方式相同,--no-R 和所有其他选项也是如此)。

... 手册页中还有更多内容...

答案2

wget具有您正在寻找的功能。来自手册页:

-i file
       --input-file=file
           Read URLs from a local or external file.  If - is specified as file, URLs are read from the standard input.  (Use ./- to read from a file literally named -.)

换句话说:wget -i filelist.txt

filelist 也不一定非得是 txt,因为 wget 通过--force-html开关支持 html。如果您只有目录/文件列表,则可以使用开关在命令行上设置基本 URL --base

答案3

但是,我不知道有哪个程序或 CLI 命令支持获取文件列表。

我不确定为什么这会成为绊脚石。你可以ftp使用脚本作为其源来运行,

cd Target_Directory
ftp -v -s:script.ftp ftp.myhost.net 1> /absolute/path/to/my/logfile 2>&1

whereTarget_Directory是您要放置即将下载的文件的位置,并且script.ftp是如下脚本文件:

USER MyUserId
MyPassword
cd SOURCE_DIR
binary
prompt n
mget the_first_file_I_need
mget the_second_file_I_need
bye

这对于单个站点。那么多个站点呢?您可以创建一个脚本文件,将其命名为 script_main,其中包含以下几行:

cd Target_Directory_1
ftp -v -s:script_1.ftp ftp.myhost_1.net 1>> /absolute/path/to/my/logfile 2>>&1
cd Target_Directory_2
ftp -v -s:script_2.ftp ftp.myhost_2.net 1>> /absolute/path/to/my/logfile 2>>&1
....

等等。您可以scrip_N.ftp通过将您拥有的信息解析为适当分离的文件来准备文件。

答案4

aria2有可能。

来自文档

-d,--dir=

存储下载文件的目录。

-i,--输入文件=

下载 FILE 中列出的 URI。您可以将多个 URI 放在一行中并用 TAB 字符分隔,从而为单个实体指定多个源。此外,可以在每个 URI 行后指定选项。选项行必须以一个或多个空格字符(SPACE 或 TAB)开头,并且每行只能包含一个选项。输入文件可以使用 gzip 压缩。

这要求每个目录都有一个单独的输入文件。

相关内容