2017-04-18 10 views
0

現在、FTPサイトからファイルをダウンロードするbashスクリプトがあります。私がダウンロードするすべてのファイルのマニフェストを保持し、マニフェストにない新しいファイルのみをダウンロードするようにスクリプトを修正したいと思います。 bashでこれを行う方法はありますか、あるいは私はbashが実際にできることの限界を押していますか?Bash以前にダウンロードしていない場合にのみFTPからファイルをダウンロードするスクリプト

+0

これは、探しているスピードと関連するファイルの数によって異なります。私は毎分数千のファイルをチェックするようなものを書きました。リストを保持し、受信したサイズをリストされたサイズと比較します。 lftpを使ってかなりうまく動作します。しかし、シンプルなケースではrsyncを使うことができます。 –

+0

残念ながら、ローカルのファイルはアーカイブに移動されますが、リモートのファイルは時折移動されるため、ここでrsyncをオプションにすることはできません。私はこれを1日に2〜3回行うだけで、ファイルの数は約1〜10(そして10は多くです)になる可能性があります。あなたが助けることができたら、私はlftpのために開いています。ありがとうございました! – Danny

+0

ええ。コードは約500行で、/ private/dataを持っていますが、基本的には 'ls'コマンドにlftpを使用し、その出力と比較します(ソートと2つの 'while'インターリーブされたbashループを介して)次のlftpの 'get'スクリプトファイルを作成します。 –

答えて

0

私の提案は、ダウンロードしたいファイルのリストを取得し、それをあなたのマニフェストと比較してから、マニフェストにないものをダウンロードすることです。このような何か作業をする必要があります:

ftp [email protected] <<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コマンドを変更して、実際のダウンロードに使用する別のファイルまたは変数にファイル名を追加します。ここで

は何が起こっているのかの説明です:

最初の3行は、(あなたが正しいディレクトリを指すように*を変更することをお勧めします。)ファイルのリストをつかむためにftpを使用

cat行は、ftp lsコマンドの出力を解析して、ファイル名部分だけを取得し、別のファイルに格納します。

その後、whileループはファイルのリストを調べ、grepを使用して、ファイル名がマニフェストファイルに存在するかどうかを確認します。表示されない場合は、ダウンロードしてマニフェストに追加できます。

は、ご質問があれば私に教えてください。

希望すると便利です。

+0

ありがとうございます!新しくダウンロードしたファイル名でManifestを更新する最良の方法は何でしょうか?どうも! – Danny

+0

マニフェストに格納したい情報に応じて、次のようなことができます: 'echo" $ file - $(date) ">> manifest.txt' - 二重引用符(" '' ")は出力をファイルに付加することを意味し、' $(date) 'はdateコマンドの出力を取得します(' Tue Apr 18 10:34:52 PDT 2017'のようになります)。 –

関連する問題