1

я использую

$ xargs -n 1 curl -O < gwurls.txt

захватить длинный список файлов. К сожалению, сайт, с которого я берусь, полагается на путь для обеспечения уникальности, поэтому -O не знает разницы между a/1.pdf и b/1.pdf и забивает файл.

Есть ли простой способ обойти это?

2 ответа2

0

Пара подходов:

  • Сделайте umask 222 (или umask 277 , если ваш umask в настоящее время 77; т.е. добавьте 200 к своему umask).  Это приведет к тому, что все создаваемые вами файлы будут защищены r-- (что угодно), а не rw- (что угодно) , поэтому после создания файла вы не сможете перезаписать его, не chmod сначала его модификацию ( если вы не работаете как root).  Это отвечает на вопрос, который вы задали в заголовке, но на самом деле не решает вашу проблему; это просто означает, что вы успешно загрузите и сохраните a/1.pdf и упустите b/1.pdf , а не наоборот.  (Если это утешит, вы получите сообщения об ошибках, предупреждающие вас о столкновениях.)
  • Кажется, проблема кроется в вашем файле gwurls.txt , который наивно перечисляет и a/1.pdf и b/1.pdf , поэтому попробуйте исправить его там.  Мангл с помощью sed или чего-то похожего
  a/1.pdf    a_1.pdf
  b/1.pdf    b_1.pdf

… А затем напишите скрипт, который запускает curl с URL-адресом $1 и выходной спецификацией $2 , и выполните

  xargs -n 2 your_script < modified_gwurls.txt ified_gwurls.txt

так что xargs побежит

your_script a/1.pdf  a_1.pdf
your_script b/1.pdf  b_1.pdf

Это становится беспорядочным, если у любого из имен файлов есть пробелы - но я думаю, что это невозможно для URL, не так ли?

0

Wget

Самым простым решением будет установка Wget и выполнение следующей команды:

wget --input-file=gwurls.txt

Wget автоматически переименовывает выходной файл, если файл с таким именем уже существует.

Переименование

Если вы удалите схему и хост (например, http://example.com/) из URL, вы можете заменить все косые черты подчеркиванием (или любым другим символом) и сохранить эти файлы. Чтобы быть в безопасности, вы можете заменить существующее подчеркивание двойным подчеркиванием.

С bash это должно работать:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"
    OUTPUT="${OUTPUT//_/__}"
    OUTPUT="${OUTPUT//\//_}"

    curl --output "$OUTPUT" --url "$URL"
done < gwurls.txt

Как это устроено:

  • while read -r URL; do ... done < gwurls.txt считывает содержимое gwurls.txt и сохраняет всю строку (без начальных или конечных пробелов) в переменной URL и выполняет ...

  • Три команды OUTPUT=... выполняют упомянутые замены, используя манипуляции со строкой bash.

  • curl --output "$OUTPUT" --url "URL" загружает файл и сохраняет его с нужным именем файла.

Структура каталогов

Также возможно воссоздать структуру каталогов сервера, используя аналогичный подход.

С bash это должно работать:

while read -r URL; do
    OUTPUT="${URL#http://example.com/}"

    curl --create-dirs --output "$OUTPUT" --url "$URL"
done < gwurls.txt

Здесь --create-dirs заставляет cURL создавать каталог a если OUTPUT читает a/1.pdf .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .