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