wget -k по-разному преобразует файлы в Windows и Linux

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

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть 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 - это единственный тик)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top