【问题标题】:How to download files from my list with wget and ftp如何使用 wget 和 ftp 从我的列表中下载文件
【发布时间】:2016-10-07 20:03:52
【问题描述】:

我只需要使用 wget 和 ftp 下载已定义的文件。 例如:

1.我使用以下方法检索所有文件:

echo ls -R | ftp ftp://user:password@host > ./list.txt

2.然后我将解析结果并得到一个包含每个文件的绝对路径的列表:

/path/to-the/file-1
/path/to-the/file-2
etc.

3.现在我需要使用 wget 和 ftp 从结果列表中下载所有文件。

而且我不想为每个文件下载过程创建单独的 FTP 会话。

请给出您的建议。谢谢。

更新:

对于递归下载,我正在使用它:wget -r ftp://user:password@host:/ -nH -P /download/path。它工作得很好,但我需要传递一个包含远程文件列表的文件,以便通过一个 FTP 会话通过 FTP 下载。

【问题讨论】:

  • mkdir downloaded; wget -P ./downloaded -i SelectedFiles.txt
  • @MarkSetchell 在这种情况下,SelectedFiles.txt 将在每个字符串中包含带有用户名和密码的 URL。例如:user:password@host:/my/file/path。我对吗?但是该进程的一个 FTP 会话呢?
  • 对于递归下载,我正在使用它:wget -r ftp://user:password@host:/ -nH -P /download/path。它工作得很好,但我需要传递一个包含远程文件列表的文件,以便通过一个 FTP 会话通过 FTP 下载

标签: linux bash shell ftp wget


【解决方案1】:

抱歉,我在评论时错过了 “单次会议” 部分。我认为您需要让脚本生成第二个脚本来运行单个 FTP 会话。

因此,您的脚本本身不会执行任何 FTP,它只会编写另一个执行传输的脚本。因此,它将编写一个执行此操作的脚本

ftp -n <SOMEADDRESS> <<EOS
quote USER <USERNAME>
quote PASS <PASSWORD>
bin
get file1 localname1
get file2 localname2
...
get fileN localnameN
quit    
EOS

然后它将执行该脚本,方法是:

bash < thatScript

所以您的脚本将如下所示:

#!/bin/bash
ScriptName=funkyFTPer
cat - <<END > $ScriptName
ftp -n 192.168.0.1 <<EOS
quote USER freddy
quote PASS frog
END

# Your selection code goes here ***PHNQZ***
echo get file1 localname1 >> $ScriptName
echo get file2 localname2 >> $ScriptName
echo get fileN localnameN >> $ScriptName

echo quit >> $ScriptName
echo EOS  >> $ScriptName
echo "Now run bash < $ScriptName"

然后删除包含您密码的脚本。或者您可以将密码放入您的.netrc 文件中。

关于在本地创建目录,您可以在第一个脚本中使用mkdir -p 执行此操作。 -p 的优点是它可以一次性创建所有目录,并且如果它们已经存在也不会感到不安。

所以,只要看看上面写着***PHNQZ*** 的代码区域,假设你的代码决定你需要文件freddy/frog/c.txt,你可以这样做:

remotename="freddy/frog/c.txt"  
localdir=${remotename%/*}         # Get just directory part using "bash Parameter Substitution"
mkdir -p "$localdir"              # make directory and all parts in between

【讨论】:

  • 非常感谢。但我有另一个关于 FTP 的问题。据我了解,当我调用 get file1 localname1 时我的本地目录不存在时,我将收到有关 localname1 的目录存在的错误。我能用它做什么?
  • 如果您使用get /a/b/c.txt,您必须在本地计算机上创建/a/b。如果您执行get /a/b/c.txt c.txt,它只会将远程文件复制到您当前的工作目录并简单地命名为c.txt,而您不需要在本地拥有/a/b
  • 如何检查路径是否存在并使用您的脚本创建带有子目录的所需目录?我需要一个递归下载的解决方案。你认为最好的方法是什么?
  • 我在回答的最后添加了一些内容。
  • 马克,谢谢。你为我节省了很多时间。你能给我一个建议,我如何控制要下载的文件的状态。例如,如果使用echo get file1 localname1 &gt;&gt; $ScriptName 下载时连接丢失。我需要重新下载文件,而不是重新启动所有文件。
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多