Вопрос или проблема
Я неожиданно узнал, что wget не скачивает заново, если файл с таким же именем уже существует.
Есть ли опция, чтобы заставить его скачать заново без удаления файла сначала в Linux?
wget -O - $url >/path/to-file
Или, если вы зеркалируете, вы можете использовать флаг -c
. Это приведет к “продолжению” файлов, но так как они уже соответствуют размеру, который сервер указывает wget, они будут “продолжены” с начала.
Это во многом зависит от того, какие опции вы задаете wget
в командной строке. Я обнаружил, что поведение по умолчанию на моих системах — это повторная загрузка, но с добавлением номера к имени файла, чтобы сделать его другим.
Вот описание опции --no-clobber
из man wget
(для wget 1.11.4) — обратите внимание на взаимодействия с другими опциями, особенно -r
и -p
. (Выделение мое.)
-nc
–no-clobber
Если файл загружается более одного раза в одном каталоге, поведение Wget
зависит от нескольких опций, включая -nc. В некоторых случаях
локальный файл будет перезаписан при повторной загрузке. В
других случаях он будет сохранен.При запуске Wget без -N, -nc, -r, или -p, загрузка того же файла в
том же каталоге приведет к сохранению оригинальной копии файла,
а вторая копия будет называться file.1. Если этот файл будет загружен
еще раз, третья копия будет называться file.2, и так далее. Когда указано
-nc, это поведение будет подавлено, и Wget откажется загружать
новые версии файла. Поэтому “no-clobber” на самом деле
является неправильным названием в этом режиме — это не предотвращение перезаписи
(поскольку числовые суффиксы уже предотвращали перезапись), а
предотвращение множественного сохранения версий.При запуске Wget с -r или -p, но без -N или -nc, повторная загрузка
файла приведет к тому, что новая копия просто перезапишет старую. Добавление -nc
предотвратит это поведение, вместо этого оригинальная версия будет
сохранена, а любые новые версии на сервере будут игнорироваться.Когда Wget запущен с -N, с или без -r или -p, решение о том,
загружать ли более новую копию файла, зависит от локальной и
удаленной метки времени и размера файла. -nc не может быть указан одновременно
с -N.Обратите внимание, что когда указано -nc, файлы с суффиксами .html или .htm будут
загружаться с локального диска и анализироваться так, как если бы они были получены
из Интернета.
Даже если /path/to/file существует, он будет перезаписан следующим образом:
wget "$URL" -O /path/to/file
Дополнительно, есть также опция –unlink:
--unlink удалить файл перед перезаписью
Это контролируется с помощью опции -nc
или --no-clobber
.
Это сложно и зависит от других опций, но у вас есть выбор перезаписи или переименования загруженных повторно файлов file.1, file.2
Судя по руководству, если вы не используете опцию ‘no-clobber’, повторно загруженные файлы будут перенумероваться. Вы видите файлы с цифровыми суффиксами?
В любом случае, смотрите man-пейдж
.
Ответ или решение
Чтобы решить задачу принудительной перезагрузки файла с помощью wget
в Linux, необходимо детально разобраться в механизмах работы этой утилиты с существующими файлами.
Теория
Команда wget
представляет собой мощный инструмент командной строки для скачивания файлов из интернета. Она поддерживает различные протоколы передачи данных, такие как HTTP, HTTPS и FTP. Однако при повторной загрузке файлов с одинаковыми именами wget
ведет себя по-разному в зависимости от используемых параметров.
Основной вопрос, возникающий у пользователей, касается того, как заставить wget
перескачать файл без предварительного удаления существующего. Стандартное поведение wget
заключается в предотвращении перезаписи, если файл уже существует. Вместо этого он может добавить числовой суффикс к имени файла.
Пример использования команд и их объяснение
-
Параметр
-O <filename>
Этот параметр позволяет указать имя файла, в который будет сохранено содержимое. Например:
wget "$URL" -O /path/to/file
В этом случае
wget
явно перезапишет файл/path/to/file
, даже если он уже существует. Это один из простейших способов принудительного перезаписи файла. -
Отключение защитного механизма с помощью
--no-clobber
Параметр
--no-clobber
или-nc
используется для предотвращения перезаписи существующего файла. Применяя его, вы фактически запрещаетеwget
загружать файл, если он уже существует в той же директории. Примечание: использование этого параметра совместно с опцией зеркалирования часто нежелательно. -
Удаление файла перед загрузкой с помощью
--unlink
Существует опция
--unlink
, которая позволяет удалить файл перед его перезаписью:wget --unlink "$URL" -O /path/to/file
Это гарантирует, что файл будет перезаписан без необходимости предварительного ручного удаления.
-
Контроль на основе параметров
-N
Параметр
-N
(--timestamp
) позволяетwget
загружать файлы только в том случае, если удаленный файл новее локального. Это полезно для синхронизации, но не решает вопрос принудительного перезагрузки. -
Другая стратегия: обход механизма переименования
Если вы хотите, чтобы
wget
загружал файл всякий раз его вручную перезаписывая, то с использованием параметра-O
вы уже минимизировали сложность задачи. В случае же, если вас устраивает добавление числовых суффиксов, то можно обойтись и без-nc
.
Применение в практическом контексте
Для практического применения команд wget
, рекомендуется определить, хотите ли вы перезаписать файлы или сохранить все версии. В случае сохранения всех версий, wget
будет добавлять числа к имени файла (например, file.1, file.2). Если же необходимо обновление файла без его переименования, следует использовать параметр -O
или опцию --unlink
для предварительного удаления.
Дополнительные рекомендации
-
Сценарии автоматизации
Если необходимо автоматизировать процесс повторного скачивания в рамках скриптов, рассмотрите включение в скрипт команд, удаляющих существующий файл перед каждой загрузкой.
-
Логирование и отладка
Для отладки и мониторинга рекомендуется использовать параметры
-d
(--debug
) и-v
(--verbose
), которые предоставляют более подробную информацию о процессе загрузки. -
Безопасность и резервное копирование
В критически важных системах использование
wget
наряду с автоматическим удалением файлов может потребовать настройки резервных копий, чтобы избежать нежелательной потери данных. -
Использование разрешения для перекрытия
При работе с файлами, особенно когда их перезапись нежелательна с точки зрения безопасности или прав доступа, всегда проверяйте права и согласия на подобное действие.
При том что wget
является инструментом, предоставляющим широкие возможности для загрузки файлов, его гибкость может варьироваться в зависимости от задач и сценариев использования. Правильное понимание и использование доступных опций позволит значительно упростить работу с перезагрузкой и управлением файлами.