wget -k по-разному преобразует файлы в Windows и Linux
Вопрос
У меня есть GNU Wget 1.10.2 для Windows и linux, а также -к опция ведет себя по-разному на этих двух.
-k, --convert-links делает так, чтобы ссылки в загруженном HTML указывали на локальные файлы.
В Windows это производит:
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:
Когда режим установлен на “unix”, Wget экранирует символ ‘/’ и управляющие символы в диапазонах 0-31 и 128-159.Это значение используется по умолчанию в Unix-подобных операционных системах.
Когда режим установлен на “windows”, Wget экранирует символы ‘\’, ‘|’, ‘/’, ‘:’, ‘?’, ‘"’, ‘*’, ‘<’, ‘>’ и управляющие символы в диапазонах 0-31 и 128-159.В дополнение к этому, Wget в режиме Windows использует ‘+’ вместо ‘:’ для разделения хоста и порта в локальных именах файлов и использует ‘@’ вместо ‘?’ для разделения части запроса на имя файла из остальных.Следовательно, URL, который был бы сохранен как ‘
www.xemacs.org:4300/search.pl?input=blah
’ в режиме Unix было бы сохранено как ‘www.xemacs.org+4300/search.pl@input=blah
’ в режиме Windows.Этот режим используется по умолчанию в Windows.
Другие советы
В Linux это проблематично, потому что, когда я обслуживаю зеркало через Apache, оно не будет различать 4 сгенерированные страницы, поскольку часть после символа questionmark (?) используется в качестве строки запроса к файлу.
Чтобы включить вопросительный знак в часть URL-пути, вы можете избежать его:
www.example.com/index.html%3Fpage=about
--convert-ссылки должны делать это за вас, я бы подумал — может быть ошибка, если нет.
В 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' {} +
Это заменяет ?в тегах href= или src= с %3F.(\x27 - это единственный тик)