

# 状況

ダウンロードを行いたいサイトは以下のような構成です。

[code]

    https://files.example/works/section_a
    https://files.example/works/section_b
    https://files.example/works/section_c
    ...
    
[/code]

これらの中で、`section_a`下のファイルのみをダウンロードしたいとします。  
しかし`section_a`内のページには **`section_b`と`section_c`へのリンクが含まれている** とします。

# 実行したこと

そこで以下のwgetコマンドを実行しました。

[code]

    wget -p -E -nH -np -k -r -l1 https://files.example/works/section_a
    
[/code]

# 実行結果

しかし結果は期待していたものではなく、`section_a`のみならず、 **同階層**
の`section_b`、`section_c`のファイルもダウンロードされてしまいます。  
**親階層** のファイルについては、期待通り取得はされておりません。

# 疑問

  * なぜ`-np`オプションを付けた状態で`https://files.example/works/section_a`を指定しているにもかかわらず、 **同階層** のディレクトリのファイルがダウンロードされてしまうのでしょうか？

  * また`section_a`のファイルのみをダウンロードする方法は存在しますか？

# 追記

## URLの末尾に/を追加

[code]

    wget -p -E -nH -np -k -r -l1 https://files.example/works/section_a/
    
[/code]

URL末尾に`/`を追加してwgetを実行した結果、`404 Not Found`となってしまいました。

[code]

    ...
    
    HTTP request sent, awaiting response... 404 Not Found
    2021-01-05 19:16:16 ERROR 404: Not Found.
    
[/code]

なお末尾にスラッシュを付けた状態でブラウザでアクセスを試みた場合、ページが見つからないという状態となっております。


CC BY-SA 4.0
2021-01-05T05:57:59.143
73089
2023-09-08T03:11:31.460
2021-01-06T12:18:55.570
9616
9616
question
bash wget
wgetにて指定したディレクトリ下のファイルのみをダウンロードしたい


指定した URL がディレクトリであるなら、 **末尾に`/` を付けて** 実行してみてください。

**参考:**  
[wgetでno-
parentが効かない](https://rougeref.hatenablog.com/entry/20130228/1362037487)

> ところがこれが期待に外れて親の階層までとりにいく。なぜだーとしらべることしばし。  
>  最後に `/` をつけなきゃダメよとのこと。
[code]

>     # wget --recursive --no-remove-listing --no-parent
> http://www.example.com/foo/baa/
>  
[/code]


CC BY-SA 4.0
2021-01-05T08:13:59.497
73093
2021-01-05T08:13:59.497
3060
73089
answer


> なぜ-
> npオプションを付けた状態でhttps://files.example/works/section_aを指定しているにもかかわらず、同階層のディレクトリのファイルがダウンロードされてしまうのでしょうか？

`-np` は `--no-parent` ですから、親階層を取得しないという意味ですよね。  
同階層は取得対象になります。

> またsection_aのファイルのみをダウンロードする方法は存在しますか？

`section_b`,`section_c`を取得しているのは`-r`で再帰取得を指定しているからなので、以下のように`-r
-l1`を付けなければいいのではないでしょうか。

[code]

    wget -p -E -nH -np -k https://files.example/works/section_a
    
[/code]

# 追記

`section_a`はファイルかと思っていましたが、ディレクトリなのですね。

`https://files.example/works/section_a`というURLが有った場合、ベースとなるディレクトリは`/works/`であり、`section_a`はファイルだと解釈されます。

`section~a`がディレクトリだった場合、通常Webサーバはクライアントにディレクトリで有る事を伝える為に`https://files.example/works/section_a/`へリダイレクトするメッセージを返します。  
`https://files.example/works/section_a/`ならばベースディレクトリは`/works/section_a/`となるので、-npオプションは期待通り働くでしょう。

しかし、wgetで`https://files.example/works/section_a/`を指定すると Not Found となるのですね。  
リダイレクト先としてファイルを直接返してきているのかもしれません。

wgetを実行した時に以下のようにリダイレクトのメッセージが出ていませんか?

[code]

    HTTP request sent, awaiting response... 301 Moved Permanently
    Location: https://files.example/works/section_a/index.html [following]
    
[/code]

リダイレクト先として`section_a`の中のファイルを返してきていた場合はwgetでそのURLを指定すればいいでしょう。

問題なのは`section_a`の外のファイルを返してきていた場合や、リダイレクトされていなかった場合ですね。その場合は以下のように`--accept-
regex`オプションで`/works/section_a`を指定してみて下さい。

[code]

    wget -p -E -nH -np -k -r -l1 --accept-regex '/works/section_a' https://files.example/works/section_a
    
[/code]

ただし、`section_a`の下のhtmlを表示するのに必要なファイル(画像等)が`section_a`の外側に有った場合は、上記だとそれらのファイルの取得が出来ません。  
その場合は以下のように`--reject-regex`オプションで`section_b`等を除外する方がいいかもしれません。

[code]

    wget -p -E -nH -np -k -r -l1 --reject-regex '/works/section_[b-z]' https://files.example/works/section_a
    
[/code]


CC BY-SA 4.0
2021-01-06T08:17:20.410
73119
2021-01-09T10:37:40.367
2021-01-09T10:37:40.367
12203
12203
73089
answer