なかなか除外コマンドが適用されず、苦しんだためメモとして残しておく。
wget
コマンドにおいて、-r
オプションと--reject-regex
オプションの順番が異なる場合に実行結果が変わるのは、wget
がオプションを処理する順序に依存しているためです。具体的には、wget
はコマンドラインで指定された順序に従ってオプションを解釈し、それぞれのオプションの効果を順番に適用します。
オプションの順序とその影響
1. -r の前に --reject-regex を指定した場合:
bashコードをコピーするwget --reject-regex "pattern" -r "https://example.com"
この場合、wget
はまず--reject-regex
を解釈し、その後に-r
(再帰的ダウンロード)を実行します。結果として、指定されたパターンに一致するファイルやディレクトリを除外しながら、再帰的にダウンロードを実行します。
2. -r の後に --reject-regex を指定した場合:
bashコードをコピーするwget -r --reject-regex "pattern" "https://example.com"
この場合、wget
は最初に-r
オプションを解釈して再帰的ダウンロードを開始し、その後に--reject-regex
を適用します。実際には、wget
は最初に-r
オプションで再帰的にダウンロードを開始し、その後のプロセスで--reject-regex
によるフィルタリングが行われることになりますが、ダウンロードの進行状況やタイミングによって、パターンが適切に適用されない可能性があります。
なぜ差異が生じるのか
wget
はオプションを指定された順序に基づいて実行します。--reject-regex
はフィルタリングを行うためのオプションであり、-r
オプションによってダウンロードが再帰的に進行する前に適用されるべきです。
--reject-regex
が先: この場合、指定されたパターンに基づいて、最初からダウンロード対象のフィルタリングが行われます。これにより、不要なファイルやディレクトリのダウンロードが未然に防がれます。-r
が先: 再帰的ダウンロードが先に実行され、wget
が探索するディレクトリやファイルのリストがすでに決定された後に--reject-regex
が適用されるため、意図したフィルタリングが行われない場合があります。つまり、フィルタリングが遅れて適用されるため、不要なファイルが一部ダウンロードされてしまう可能性があります。
結論
wget
コマンドで-r
オプションと--reject-regex
オプションの順序が実行結果に影響する理由は、wget
がコマンドライン引数を解釈する順序に依存するためです。--reject-regex
はフィルタリングを行うため、-r
オプションで再帰的にダウンロードを始める前に指定するのが一般的に望ましいです。これにより、不要なファイルのダウンロードを防ぐことができます。