いろいろ探しましたが、問題の答えが見つかりません。ここが適切なフォーラムかどうかわかりませんが、ここで誰かが助けてくれることを願っています。
最近まで、ミラー オプションを使用して、問題なく wget (FTP) で Web サイトをローカル HD にバックアップしていました。最近、画像を保持するディレクトリが、ホスティング サービスによって設定された、FTP リストに含めることができるアイテム数の制限に達しました。アカウントへの SSL アクセスがありません。
リモート サーバー上でスクリプトを実行し、完全なディレクトリ リスト (ls) をファイルに取得して、ローカル マシンにダウンロードできます。
このファイルを wget に渡して、リスト制限に達する前のように、それらのファイルをローカル ドライブにミラーリングすることは可能ですか? wget で生成されたリストを読み取り、変更されたファイルや追加されたファイルをチェックしたいと思います。答えが見つからない質問は次のとおりです。
1) 必要な情報を生成するための適切な ls コマンドは何でしょうか? 現在は実際のファイル名しか取得できませんが、もっと必要なのは確かです。
2) ミラー オプション付きの wget は入力ファイルでも機能しますか、それとも変更されたステータスを確認せずに入力ファイル内のすべてのファイルをダウンロードするだけですか? この組み合わせに関する情報はまったく見つかりませんでした。どちらか一方に関する情報しかありません。テストしてディレクトリの完全バックアップを取得することはしたくありません。すべてのデータをダウンロードするのに帯域幅と時間が無駄になります。
答え1
これは可能ですが、唯一の問題は出力を取得することですlsこれはリモートマシンでもローカルマシンでも同じです。私のlsにはオプションがあります
--time-style=+%sこれは、エポックからの秒数でファイルの最終変更時間を表示します。これは両方のマシンで一致している必要があります。これを 1 つのディレクトリに対してのみ実行したいと想定していますが、そうでないfind
場合は、そのコマンドがある方が適切です。
リモートで、必要なディレクトリのファイルに ls を実行します。
cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile
ローカルマシンで、リモートを/tmp/listfile
ローカルにコピーし/tmp/listfile
、
awk出力の最初の 4 列を抑制し、ファイル サイズ、日付、ファイル名のリストをソートします。(ファイル名にスペースが含まれている可能性があると想定しているため、awk が奇妙になっています)。
awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a
ミラーリングされたディレクトリで同じリストを取得します。
cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b
2つのソートされたリストを比較し、同じ行を削除します。 通信サイズと日付の列を削除し(ついでに/tmp/bの行頭のタブと2つの列間スペースも削除し、重複したファイル名を削除します。ユニーク(重複行は隣接しているので、再度並べ替える必要はありません)。
comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c
/tmp/c のリストには、新しいファイル、サイズやタイムスタンプが異なるファイル、または削除されたファイルがすべて含まれています。各ファイルを wget に渡して取得します (適切なディレクトリにまだあります)。
while read file
do rm -f "$file"
wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c
このディレクトリを取得しないように wget ミラーを設定する必要があります。
できる場合はfind ... -printf '%9s %T+ %p\n'
、ミラー ディレクトリの先頭から始めて、この種のテクニックを使用して、ミラーリングを効果的に自分で行うことができます。