【问题标题】:Bash Script that downloads file from FTP only if it hasn't downloaded it previously仅在以前未下载文件时才从 FTP 下载文件的 Bash 脚本
【发布时间】:2017-04-18 13:34:50
【问题描述】:

我目前有一个从 FTP 站点下载文件的 bash 脚本。我想修改脚本以保留它下载的每个文件的清单,并且只下载不在清单中的任何新文件。有没有办法在 bash 中做到这一点,还是我在推动 bash 实际可以做的事情的限制?

【问题讨论】:

  • 这取决于您要查找的速度和相关文件的数量。我写了类似的东西,每分钟检查几千个文件。它会根据列出的尺寸保存列表并检查收到的尺寸。效果很好,使用 lftp。但是你可以在简单的情况下使用 rsync。
  • 不幸的是,rsync 在这里不能作为一个选项,因为本地文件将被移动到存档,但远程文件偶尔会移动。我每天只看 2-3 次,文件数量可能在 1-10 左右(10 很多)。如果你能提供帮助,我愿意接受 lftp。谢谢!
  • 呃。代码长约 500 行,其中包含 /private/ 数据,但基本上它使用 lftp 执行“ls”命令,记录其输出和与之前给出的比较(通过排序和两个“while”交错 bash 循环)调用,构建下一个 lftp 'get' 脚本文件。

标签: linux bash shell ftp sftp


【解决方案1】:

我的建议是获取您可能想要下载的文件列表,将其与您的清单进行比较,然后下载不在清单中的文件。这样的事情应该可以工作:

ftp username@hostname <<EOF
ls * filelist.txt
EOF
cat filelist.txt | awk '{print $9}' | tail -n +3 > filenames.txt
while IFS= read -r file
  do
    if [[ ! $(grep "$file" manifest.txt) ]]; then
       echo "$file is not in manifest"
    fi
  done < "filenames.txt"

当然,您需要更改 filelist.txtfilenames.txt 以包含适当的路径。此外,更改echo 命令以将文件名添加到您将用于进行实际下载的另一个文件或变量中。

下面是对发生的事情的解释:

前三行使用ftp 获取文件列表(您需要更改* 以指向正确的目录。)

cat 行解析 ftp ls 命令的输出以仅获取文件名部分并将其放入另一个文件中。

然后while循环遍历文件列表并使用grep查看文件名是否存在于manifest文件中。如果没有,您可以下载它并将其添加到清单中。

如果您有任何问题,请告诉我。

希望这会有所帮助!

【讨论】:

  • 谢谢!用新下载的文件名更新清单的最佳方法是什么?谢谢!
  • 根据您要在清单中存储的信息,您可以执行以下操作:echo "$file - $(date)" &gt;&gt; manifest.txt -- 双倍大于 ("&gt;&gt;") 意味着将输出附加到文件和$(date) 获取日期命令的输出(如下所示:Tue Apr 18 10:34:52 PDT 2017)。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2011-05-29
相关资源
最近更新 更多