wget -kは、WindowsとLinuxでファイルを異なる方法で変換します

StackOverflow https://stackoverflow.com/questions/629831

  •  08-07-2019
  •  | 
  •  

質問

WindowsとLinux向けの GNU Wget 1.10.2 があり、これら2つで -k オプションの動作が異なります。

  

-k、-convert-linksは、ダウンロードしたHTML内のリンクがローカルファイルを指すようにします。

生成されるウィンドウ:

www.example.com/index.html
www.example.com/index.html@page=about
www.example.com/index.html@page=contact
www.example.com/index.html@page=sitemap

そしてLinuxでは以下を生成します:

www.example.com/index.html
www.example.com/index.html?page=about
www.example.com/index.html?page=contact
www.example.com/index.html?page=sitemap

これはLinuxで問題になります。Apacheを介してミラーを提供すると、疑問符()文字の後の部分がクエリ文字列として使用されるため、生成された4つのページを区別できないためですファイル。

これを制御する方法に関するアイデアはありますか?

ありがとう

役に立ちましたか?

解決

NTFSまたはFAT32のファイル名に疑問符(?)は使用できません。これが、wgetが代わりにat記号(@)を使用する理由です。

Linuxでは、ほとんどのファイルシステムでスラッシュ(/)のみが禁止されているため、wgetは疑問符を使用します(URIの一部であるため)。

--restrict-file-names=unixまたは--restrict-file-names=windowsを使用して、いずれかの動作を強制できます。

wgetのドキュメントから:

  

モードが<!>#8220; unix <!>#8221;に設定されている場合、Wget   文字をエスケープします<!>#8216; / <!>#8217;そしてその   0 <!>#8211; 31の範囲の制御文字   および128 <!>#8211; 159。これはデフォルトの   UnixライクなOS。

     

モードが<!>#8220; windows <!>#8221;に設定されている場合、Wget   文字をエスケープします<!>#8216; \ <!>#8217 ;, <!>#8216; | <!>#8217 ;, <!>#8216; / <!>#8217 ;,   <!>#8216;:<!>#8217 ;, <!>#8216;?<!>#8217 ;, <!>#8216; <!> quot; <!>#8217 ;, <!># 8216; * <!>#8217 ;, <!>#8216; <!> lt; <!>#8217 ;, <!>#8216; <!> gt; <!>#8217;および   0 <!>#8211; 31の範囲の制御文字   および128 <!>#8211; 159。これに加えて、Wget   Windowsモードでは<!>#8216; + <!>#8217;を使用します。の代わりに   <!>#8216;:<!>#8217;ローカルでホストとポートを分離する   ファイル名、および<!>#8216; @ <!>#8217;の代わりに   <!>#8216;?<!>#8217;のクエリ部分を分離する   残りのファイル名。   したがって、保存されるURL   として   <!>#8216; www.xemacs.org:4300/search.pl?input=blah <!>#8217;   Unixモードでは次のように保存されます   <!>#8216; www.xemacs.org+4300/search.pl@input=blah <!>#8217;   Windowsモード。このモードは   Windowsのデフォルト。

他のヒント

  

これはLinuxで問題になります。Apacheを介してミラーを提供すると、疑問符(?)文字の後の部分がファイルへのクエリ文字列として使用されるため、生成された4つのページを区別できません。

URLパス部分に疑問符を含めるには、エスケープすることができます:

www.example.com/index.html%3Fpage=about

-convert-linksがあなたのためにこれを行うべきだと思います、<!>#8201; <!>#8212; <!>#8201;そうでなければバグかもしれません。

  

これはLinuxで問題になります   Apacheは、生成された4つのページを区別しません。   疑問符(?)文字の後の部分がクエリ文字列として使用されます   ファイルに。

すでに遅刻している場合、このsedコマンドが役に立ちました:

find . -type f -name "*html*" -exec sed -i -r 's/(src|href)=(["\x27])(.*?)(\?)(.*?)\2/\1=\2\3%3F\5\2/g' {} + 

?を置き換えます%3Fのhref =またはsrc =タグ内。 (\ x27は単一のティックです)

scroll top