it-swarm-ja.com

wget-すべてのサブディレクトリで.listingファイルのみを取得します

コマンドを使用する場合

wget --no-remove-listing -P ...../debugdir/gnu/<dir>/ ftp:<ftp-site>/gnu/<dir>/

そのディレクトリの.listingファイルを取得します。ただし、構造全体を取得するには、後続の各サブディレクトリをステップスルーする必要があります。 1つのコマンドですべての(サブ)ディレクトリから.listingファイルを取得する方法はありますか?

また、ファイルindex.htmlはアクセスのたびに自動的に生成されることに気づきました。この動作を抑制する方法はありますか?

問題は、Bashの処理が常に遅いことですが、プロファイリングを行った後、最大の遅延は、後続のサブディレクトリから各.listingファイルを取得することであることがわかりました。

例:GNUツリーで特定のファイル拡張子を確認するには約320秒かかり、そのうち290秒は上記のwgetコマンドの処理に使用されます。

4
Frans

FTPサイトのインデックスを作成する場合、つまり、実際に取得せずにサイト上のすべてのサブディレクトリとファイルを一覧表示する場合は、次のようにします。

wget -r -x --no-remove-listing --spider ftp://ftp.example.com/

どこ、

  • -r =>再帰的(つまり、サブディレクトリにアクセスする)
  • -x =>クライアントでミラーサブディレクトリを強制的に作成する
  • --no-remove-listing =>各サブディレクトリに「.listing」ファイルを残します
  • --spider =>アクセスしますが、ファイルを取得しません

これにより、クライアント上にサーバーと同じ構造のスパースディレクトリツリーが作成され、各ディレクトリの内容(「ls-l」の結果)を示す「.listing」ファイルのみが含まれます。これをパス修飾ファイル名の単一のリストにダイジェストする場合(「find.-type f」から取得する場合のように)、そのスパースディレクトリツリーのルートでこれを実行します。

find . -type f -exec dos2unix {} \;
( find . -maxdepth 999 -name .listing -exec \
awk '$1 !~ /^d/ {C="date +\"%Y-%m-%d %H:%M:%S\" -d \"" $6 " " $7 " " $8 "\""; \
C | getline D; printf "%s\t%12d\t%s%s\n", D, $5, gensub(/[^/]*$/,"","g",FILENAME), $9}' \
{} \; 2>/dev/null ) | sort -k4

次のような出力が得られます

2000-09-27 00:00:00       261149    ./README
2000-08-31 00:00:00       727040    ./foo.txt
2000-10-02 00:00:00      1031115    ./subdir/bar.txt
2000-11-02 00:00:00      1440830    ./anotherdir/blat.txt

注意:このユースケースでは「-maxdepth999」オプションは必要ありません。テストしていた呼び出しに、報告されたツリーの深さを制限するという追加の制約を残しました。たとえば、次のような複数のプロジェクトの完全なソースツリーを含むサイトをスキャンする場合

./foo/Makefile
./foo/src/...
./foo/test/...
./bar/Makefile
./bar/src/...
./bar/test/...

次に、プロジェクトの概要とトップレベルのディレクトリのみが必要になる場合があります。この場合、「-maxdepth2」のようなオプションを指定します。

5
Codex24