wget -kは、WindowsとLinuxでファイルを異なる方法で変換します
質問
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は単一のティックです)