Wie kann ich wget umbenennen, dass heruntergeladene Dateien die Abfragezeichenfolge nicht enthalten?

23880
Keith Twombley

Ich lade eine Website mit wget herunter und vielen Links sind Abfragen beigefügt. Wenn ich also folgendes tue:

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

Ich habe am Ende viele Dateien wie diese:

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

Was ich gerne enden würde, ist:

1.mp3 2.mp3 3.mp3 

Das alles findet in Ubuntu Linux statt und ich habe wget 1.10.2.

Ich weiß, dass ich dies tun kann, nachdem ich alles über ein Skript erhalten habe, um alles umzubenennen. Ich möchte jedoch wirklich eine Lösung aus dem Inneren von wget, so dass ich die korrekten Namen sehen kann, wenn der Download stattfindet.

Kann mir jemand helfen, das zu enträtseln?

22
Stellen Sie Ihre Frage unter www.stackoverflow.com. Deniz Zoeteman vor 15 Jahren 0
@TutorialPoint warum? Frage ist auf der Suche nach einem In-Wget-Weg, um es zu tun, SO würde es einfach wieder hierher migrieren. quack quixote vor 15 Jahren 2
Nun, es gibt keinen In-Wget-To-Do-It ayrnieu vor 15 Jahren 0
@ayrnieu: nicht in einem Befehl, nein. und nicht ohne helfer. Sie können dies jedoch mit nur n + 1 wget-Befehlen (wenn nicht weniger) tun. quack quixote vor 15 Jahren 1

7 Antworten auf die Frage

21
Filox

Wenn es sich bei dem Server um einen freundlichen Server handelt, wird möglicherweise ein Content-Disposition-Header in den Download eingefügt, der Ihren Client über den richtigen Dateinamen informiert. Wget mitzuteilen, dass der Header für den endgültigen Dateinamen gehört, ist so einfach:

wget --content-disposition 

Sie benötigen eine neuere Version von wget, um diese Funktion verwenden zu können.

Ich habe keine Ahnung, wie gut ein Server mit dem Dateinamen '/ etc / passwd' umgehen kann.

14
Gregory Wolf

Nach der Verarbeitung eines großen Batches wurde mir klar, dass ich die Abfragezeichenfolgen wgetignorieren sollte . Ich wollte es nicht noch einmal machen, also machte ich dieses Skript, das für mich funktionierte:

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

Fügen Sie das in eine Datei wie rmqstrund chmod +x rmqstr Syntax ein:./rmqstr <directory (defaults to .)>

Die Abfragezeichenfolgen werden dabei rekursiv von allen Dateinamen entfernt.

4
quack quixote

Ich denke, wgetum einen anderen Dateinamen als die URL zu speichern, müssen Sie das -O filenameArgument verwenden. Das macht nur das, was Sie wollen, wenn Sie ihm eine einzige URL geben - bei mehreren URLs landen alle heruntergeladenen Inhalte in filename.

Aber das ist wirklich die Antwort. Anstatt zu versuchen, alles in einem wgetBefehl auszuführen, verwenden Sie mehrere Befehle. Jetzt wird Ihr Workflow:

  1. Führen wgetSie den Befehl aus, um die Basis-HTML-Datei (en) mit Ihren Links zu erhalten.
  2. Nach URLs durchsuchen
  3. Foreach URL Endung mp3,
    1. Prozess-URL, um einen Dateinamen zu erhalten (zB http://foo/bar/baz.mp3?gargle=blasterinbaz.mp3
    2. (optional) Überprüfen Sie, ob der Dateiname nicht existiert
    3. Lauf wget <URL> -O <filename>

Das löst Ihr Problem, aber Sie müssen jetzt herausfinden, wie Sie die Basisdateien abrufen, um Ihre mp3URLs zu finden .

Haben Sie eine bestimmte Website / Basis-URL im Sinn? Die Schritte 1 und 3 werden anhand eines konkreten Beispiels einfacher gehandhabt.

1
ayrnieu

Ich kann also die richtigen Namen sehen, wenn der Download stattfindet.

OK. Verwenden Sie wget wie gewohnt; Verwenden Sie das Post-Wget-Skript, das Sie normalerweise verwenden, aber verarbeiten Sie die Ausgabe von Wget so, dass es für die Augen einfacher ist:

#! /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 

Dies wird weiterhin ?foo=barangezeigt, während Sie heruntergeladen werden, der Rest des Namens wird jedoch in hellem Cyan angezeigt.

Dadurch wird das Problem der angezeigten Dateinamen etwas gelöst, aber das OP möchte auch, dass der endgültige Dateiname keine Abfragezeichenfolge enthält. Michael Mior vor 10 Jahren 0
1
KittMedia

Ich habe einen ähnlichen Ansatz wie @Gregory Wolf, da sein Code immer Fehlermeldungen wie diese hervorbrachte:

mv: './file' und './file' sind die gleichen Dateien

Daher überprüfe ich zuerst, ob sich im Dateinamen eine Abfragezeichenfolge befindet, bevor Sie die Datei verschieben:

for f in $(find $1 -type f); do if [ $f = $ ]; then continue; fi mv "$" "$" done 

Dadurch werden alle Dateien rekursiv überprüft und, sofern verfügbar, alle Abfragezeichenfolgen in ihren Dateinamen entfernt.

0
Vijay Padhariya

Sehen Sie sich diese beiden Befehle an, die ich zum Klonen einer Site erstellt habe, und nachdem der Klonvorgang abgeschlossen ist, können Sie den zweiten Befehl ausführen.

Der zweite Befehl zeigt den gesamten Klon an, sucht nach " ? " - Dateinamensnamen und entfernt die Abfragezeichenfolge aus dem Dateinamen.

# 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 

(Siehe in GitHub Gist .)

-2
robcore

Noch einfacher geht es hier: https://unix.stackexchange.com/questions/196253/how-do-you-rename-filesspezifisch-in-a-list-that-wget-will-use

Dies schlägt eine Methode vor, die im Wesentlichen die Umbenennungsfunktion von wget (kann geändert werden, um das Verzeichnis einzuschließen) für mehrere Dateien verwenden. Siehe die zweite vorgeschlagene Version.

Können Sie bitte die relevanten Informationen aus dem Link angeben, damit wir wissen, welches Material Ihrer Meinung nach diese Frage beantwortet. Ramhound vor 8 Jahren 2