名前が若干変更される可能性がある場合は、wgetを使用してファイルをインポートしてください。

名前が若干変更される可能性がある場合は、wgetを使用してファイルをインポートしてください。

私は5つの政府ソースからデータをインポートし、会社の大規模データベースにマージするプログラムを持っています。 wgetを使用してファイルを検索します。しかし、ソースの1つが更新されるたびに名前が変更されることがわかりました。

たとえば、最後にファイルを受け取ったときのファイル名はでしたmyfile150727.flatfile。今日のプログラムを実行しようとすると、終了ステータスは8でしたno such file。手動でFTP経由でファイル名があることを確認しましたmyfile150914.flatfile。明らかに、ファイル名は最後の更新日に応じて変更されます。

これを考慮してスクリプトを修正し、ファイルを自動的にダウンロードできますか?

答え1

はい、しかし、詳細はファイル名がどのように変更されるかによって異なります。常に今日の日付の場合は、その日付をインポートするようにスクリプトに指示してください。

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

または、毎日更新されないというファイルが1つしかない場合は、次の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 $site削除しますlcd $site
  • 更新プロセスによってrmは、転送する前にこれを行うこともできます。

関連情報