Як зробити так, щоб wget перейменувати завантажені файли, щоб не включати рядок запиту?


25

Я завантажую сайт з wget, і багато посилань мають додані до них запити, тому, коли я роблю це:

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

Я маю багато файлів, наприклад:

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

Я хотів би отримати:

1.mp3
2.mp3
3.mp3

Це все відбувається в Ubuntu Linux і у мене є wget 1.10.2.

Я знаю, що я можу зробити це після того, як я отримаю все через скрипт, щоб перейменувати все. Однак мені дуже подобається рішення зсередини wget, щоб я міг бачити правильні імена під час завантаження.

Хто-небудь може допомогти мені розгадати це?


Напишіть своє запитання на www.stackoverflow.com.
Deniz Zoeteman

2
@TutorialPoint чому? Питання шукає всередині-wget-шлях-до-зробити-це, ТАК би просто мігрувати його назад.
quack quixote

Ну, немає ніякого внутрішньо-wget-шляху-до-зробити-це
ayrnieu

1
@ayrnieu: не в одній команді, ні. і не без помічника. але ви, звичайно, можете зробити це за допомогою всього лише n + 1 wget команд (якщо не менше).
quack quixote

Відповіді:


22

Якщо сервер є добрим, він може приклеювати заголовок Content-Disposition на завантаження, що рекомендує клієнту правильне ім'я файлу. Повідомляючи Wget про слухання цього заголовка для остаточного імені файлу, це просто:

wget --content-disposition

Щоб використовувати цю функцію, потрібна нова версія wget.

Я не маю уявлення, наскільки добре він працює з сервером, який претендує на назву файлу '/ etc / passwd'.


15

Я зрозумів, після обробки великої партії, що я повинен був доручити wget ігнорувати рядки запитів. Я не хотів робити це знову, тому я зробив цей сценарій, який працював для мене:

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

Помістіть це у файл, як rmqstr і chmod +x rmqstr Синтаксис: ./rmqstr <directory (defaults to .)>

Він рекурсивно видаляє рядки запитів з усіх імен файлів.


4

Думаю, щоб отримати wget Щоб зберегти як назву файлу, відмінну від URL-адреси, потрібно використовувати -O filename аргумент. Це робить тільки те, що ви хочете, коли ви надаєте їй єдину URL-адресу - з декількома URL-адресами, весь завантажений вміст закінчується filename.

Але це дійсно відповідь. Замість того, щоб намагатися зробити це все в одному wget команду, використовуйте кілька команд. Тепер ваш робочий процес стає:

  1. Запустити wget отримати базовий HTML-файл (файли), що містить ваші посилання;
  2. Розбір URL-адрес;
  3. URL-адреса, що закінчується mp3,
    1. URL-адреса процесу для отримання імені файлу (наприклад, поворот http://foo/bar/baz.mp3?gargle=blaster в baz.mp3
    2. (необов'язково) перевірте, що ім'я файлу не існує
    3. бігти wget <URL> -O <filename>

Це вирішує вашу проблему, але тепер потрібно з'ясувати, як захопити базові файли, щоб знайти свій mp3 URL-адреси.

Чи є у вас певний сайт / базовий URL? Етапи 1 і 3 будуть легше оброблятися на конкретному прикладі.


1

щоб побачити правильні імена, як це відбувається.

В ПОРЯДКУ. Використовуйте wget як звичайно; використовуйте сценарій, який ви зазвичай використовуєте, але обробляйте вихід wget так, щоб на очах було легше:

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

Це все одно покаже ?foo=bar як ви завантажуєте, але відображатимете решту імені в яскравому блакитному кольорі.


Це дещо вирішує проблему відображення назв файлів, але операційна система також хоче, щоб остаточне ім'я файлу не мали рядка запиту.
Michael Mior

1

Я маю аналогічний підхід, як @Gregory Wolf, оскільки його код завжди створював такі повідомлення про помилки:

mv: './file' і './file' - це той самий файл

Таким чином, я спочатку перевіряю, чи є рядок запиту в імені файлу, перш ніж перемістити файл:

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

Це буде рекурсивно перевіряти кожен файл і видаляти всі рядки запитів у їх імена файлів, якщо такі є.


0

Подивіться на ці дві команди, які я створив для клонування сайту, і після завершення клонування можна виконати другу команду.

Друга команда розгляне весь клон, шукає " ? "імена файлів шаблонів, і видалити рядок запиту з імені файлу.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

(Див GitHub Gist .)


-2

Ще простіше це: https://unix.stackexchange.com/questions/196253/how-do-you-rename-files-specifically-in-a-list-that-wget-will-use

Це передбачає метод, який, по суті, використовує функцію перейменування wget (може бути змінено, щоб включити каталог) для декількох файлів. Див. Другу запропоновану версію.


2
Чи можете ви надати відповідну інформацію з посилання, щоб ми знали, який матеріал, на вашу думку, відповідає на це запитання.
Ramhound
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.