私は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
は、転送する前にこれを行うこともできます。