Как корректно загрузить файлы с одинаковыми названиями, но разным регистром, с помощью wget?

Здравствуйте! У меня возникли проблемы с загрузкой файлов с помощью 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%[=====================================&gt;] 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. 

Как правильно настроить команду, чтобы файлы сохранялись корректно, без добавления временного расширения?
  • 12 октября 2024 г. 0:42
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с тем, что `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
Похожие вопросы