我有一个远程服务器上文件的绝对路径列表(几千个),需要将其下载到我的电脑上。
我还需要这些文件来保持这些文件的目录结构完整。
例子:
/* 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
通过将您拥有的信息解析为适当分离的文件来准备文件。