Здравствуйте! У меня возникли проблемы с загрузкой файлов с помощью wget, так как я ранее с этим не сталкивался. У меня есть список ссылок на изображения, и я заметил, что некоторые файлы имеют одинаковое название, но различаются только регистром одной буквы, например, X6jIQ и X6jIq. При использовании wget для загрузки этих файлов происходит следующая ситуация: один файл сохраняется, а другой нет. В выводе я вижу такое сообщение: <pre><code>--2024-10-12 01:51:10-- https://сайт/X6jIq.jpg Connecting to сайт (сайт)|65.21.143.8|:443... connected. HTTP request sent, awaiting response... 301 Moved Permanently Location: https://сайт/X6jIq.jpg [following] --2024-10-12 01:51:11-- https://сайт/X6jIq.jpg Reusing existing connection to сайт:443. HTTP request sent, awaiting response... 200 OK Length: 117588 (115K) [image/jpeg] Saving to: ‘X6jIq.jpg.1.tmp’ X6jIq.jpg.1.tmp 100%[=====================================>] 114.83K --.-KB/s in 0.04s 2024-10-12 01:51:11 (2.62 MB/s) - ‘X6jIq.jpg.1.tmp’ saved [117588/117588] Removing X6jIq.jpg.1.tmp since it should be rejected.</code></pre> Я использую такую команду wget: <pre><code>echo "список ссылок" | xargs -d \; -t wget --timeout=1 --tries=1 -nd -E -H -k -K -p -A jpg,jpeg,png,gif -e robots=off;</code></pre> Если я добавляю к строке расширение tmp, файлы сохраняются как X6jIq.jpg.1.tmp. Как правильно настроить команду, чтобы файлы сохранялись корректно, без добавления временного расширения?
Проблема, с которой вы столкнулись, связана с тем, что `wget` по умолчанию избегает перезаписи файлов с уже существующими именами. Когда вы загружаете файлы с одинаковыми названиями, но с разным регистром, `wget` считает, что это один и тот же файл, и добавляет суффикс `.1.tmp` к новому файлу. Чтобы корректно загружать файлы с одинаковыми названиями, но с разным регистром, вы можете использовать параметр `--no-clobber`, который предотвращает перезапись файлов, но в вашем случае это не поможет. Вместо этого можно воспользоваться следующим подходом: 1. **Изменить имя сохраняемого файла:** Вы можете перехватывать URL и вручную задавать имя файла, используя `-O` или `--output-document`, чтобы задать уникальное имя на основе URL или других критериев. 2. **Использовать `--restrict-file-names=nocontrol`:** Этот параметр позволяет `wget` игнорировать регистр файловой системы. Таким образом, любой файл, который будет загружен, сохраняется с уникальным именем, несмотря на его регистр. На некоторых системах это может не сработать, если файловая система чувствительна к регистру. Пример команды с использованием `-O` может выглядеть следующим образом: ```bash echo "список ссылок" | while IFS= read -r url; do wget --timeout=1 --tries=1 -nd -E -H -k -K -p -A jpg,jpeg,png,gif -e robots=off "$url" -O "$(basename "$url" .jpg)_$(date +%s).jpg" done ``` В этом примере `$(basename "$url" .jpg)` берет имя файла без расширения, а `$(date +%s)` добавляет временную метку к имени файла, чтобы убедиться, что оно будет уникальным. Если хотите сохранить оригинальные имена файлов, вы можете модифицировать `wget` таким образом: ```bash echo "список ссылок" | while IFS= read -r url; do name=$(basename "$url") if [ -f "$name" ]; then mv "$name" "$name.bak" fi wget --timeout=1 --tries=1 -nd -E -H -k -K -p -A jpg,jpeg,png,gif -e robots=off "$url" done ``` Этот скрипт проверяет, существует ли файл с таким именем, и если он существует, переименовывает его, чтобы сохранить. Таким образом, вы сможете загружать и забирать файлы с одинаковыми именами.
Полагаю используется windows?
wget пришел из мира *nix где файловая система где большие и маленькие буквы считаются разными, а в windows - одинаковыми, при попытке сохранить файл с отличающимся регистром в имени, он получает ошибку что файл существует. По уму wget в таком случае должен сохранить в файле с новым именем, добавив *.1 в конец, но похоже именно из-за того что формально имена разные, этого не происходит.
Решение, указать принудительно новое имя файла с помощью ключа -O имя_файла, к сожалению просто твою команду не исправить, но можно предварительно в скрипт добавить проверку наличия файла с таким именем и если существует, давать другую команду с -O