当文件名可能略有变化时使用 wget 获取文件

当文件名可能略有变化时使用 wget 获取文件

我有一个程序,可以从五个政府来源获取数据,并将它们合并到我公司的一个大型数据库中。我使用 wget 来检索文件。然而我发现其中一个来源每次更新时都会更改名称。

例如,我上次获取该文件时,它的名称是myfile150727.flatfile.今天,当我尝试运行我的程序时,我得到了退出状态 8 no such file。当我手动进入 ftp 时,我发现该文件现在名为myfile150914.flatfile.显然,文件名根据上次更新的日期而变化。

我可以修改我的脚本以考虑这一事实并仍然自动下载文件吗?

答案1

是的,但详细信息取决于文件名称的更改方式。如果它始终是今天的日期,只需告诉您的脚本即可获取该日期:

filename=myfile"$(date +%y%m%d)".flatfile
wget ftp://example.com/"$file"

或者,如果它不是每天更新并且只有一个名为 的文件myfileWHATEVER.flatfile,请获取:

wget "ftp://example.com/myfile*.flatfile"

如果您有许多具有相似名称的文件,您可以下载所有文件,然后仅保留最新的:

wget -N "ftp://example.com/myfile*.flatfile"
## Find the newest file
for file in myfile*.flatfile; do
    [[ "$file" -nt "$newest" ]] && newest="$file";
done
## Delete the rest
for file in myfile*.flatfile; do
    [[ "$file" != "$newest" ]] && rm "$file"
done

或者,您可以从文件名中提取日期:

wget -N "ftp://example.com/myfile*.flatfile"
for file in myfile*.flatfile; do
    fdate=$(basename "${file//myfile}" .flatfile)
    [[ "$fdate" -gt $(basename "${nfile//myfile}" .flatfile) ]] && nfile="$file"
done
for file in myfile*.flatfile; do
    [[ "$file" = "$nfile" ]] || rm "$file"
done

请注意,如果多个文件具有相同的修改日期,则上述内容将保留多个文件。

答案2

就像是

for site in site1.com site2.com
do
   mkdir -p $site
   ftp -in <<EOF
   connect $site
   user archemar foo
   lcd $site
   cd /path/to/remote/file
   mget myfile*.fileflat
   quit
EOF
done
  • 替换user archemar foo为您的用户名和密码,或者user ftp如果允许匿名 ftp。
  • 替换cd /path/to/remote/file为明显的
  • 这会将杂项 *.flatfile 放置在相应的站点目录中。如果名称是唯一的,则删除mkdir $sitelcd $site
  • 根据您的更新流程,您可能希望在rm传输之前进行。

相关内容