Wie kann ich die heruntergeladenen Dateien so umbenennen, dass sie die Abfragezeichenfolge nicht enthalten?


32

Ich lade eine Site mit wget herunter und viele Links sind mit Suchanfragen verknüpft. Wenn ich das mache:

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

Am Ende habe ich viele Dateien wie diese:

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

Am Ende möchte ich Folgendes haben:

1.mp3
2.mp3
3.mp3

Dies findet alles unter Ubuntu Linux statt und ich habe wget 1.10.2.

Ich weiß, dass ich das tun kann, nachdem ich alles über ein Skript erhalten habe, um alles umzubenennen. Ich hätte jedoch gerne eine Lösung aus wget heraus, damit ich die korrekten Namen sehen kann, während der Download stattfindet.

Kann mir jemand helfen, das zu entwirren?


Stellen Sie Ihre Frage unter www.stackoverflow.com.
Deniz Zoeteman

3
@ TutorialPoint warum? Diese Frage sucht nach einer Möglichkeit innerhalb von wget, also würde sie einfach hierher zurück migrieren.
Quack Quijote

Nun, es gibt keine Möglichkeit, es zu tun
ayrnieu

1
@ayrnieu: nicht in einem Befehl, nein. und nicht ohne helfer. Sie können dies jedoch mit nur n + 1 wgetBefehlen (wenn nicht weniger) tun .
Quack Quijote

Antworten:


24

Wenn der Server freundlich ist, kann es sein, dass er beim Herunterladen einen Content-Disposition-Header anbringt, der Ihren Client über den korrekten Dateinamen informiert. Es ist ganz einfach, wget zu sagen, dass er diesen Header nach dem endgültigen Dateinamen anhören soll:

wget --content-disposition

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

Ich habe keine Ahnung, wie gut es mit einem Server umgeht, der den Dateinamen '/ etc / passwd' beansprucht.


Ich habe kein Problem mit dieser Antwort, da es zweifellos für einige Situationen funktioniert. Leider hat es bei einigen Cloudfront- bedienten Seiten mit darin enthaltener ?v=blahTyp-Versionierung nicht funktioniert . Ich weiß nicht, ob es eine cloudfront-spezifische Möglichkeit gibt, ein Dokument ohne diese Informationen anzufordern, aber ich habe keine gefunden. In diesem Fall ist möglicherweise eine der anderen Antworten erforderlich. (Wenn jemand eine Möglichkeit kennt, die v=Saiten zu entfernen oder Cloudfront davon abzuhalten, sie zu bedienen , würde ich gerne davon hören.)
Lindes,

17

Nach der Verarbeitung eines großen Stapels wurde mir klar, dass ich hätte die Abfragezeichenfolgen wgetignorieren sollen. Ich wollte es nicht noch einmal machen, also habe ich dieses Skript erstellt, das für mich funktioniert hat:

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

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

Die Abfragezeichenfolgen werden rekursiv aus allen Dateinamen entfernt.


2
Ich würde `-name" \? "` Hinzufügen , um einen Teil zu finden, der nur die benötigten Dateien enthält :)
Arkadiusz 'fliegt' Rzadkowolski

4

Ich denke, um wgetzu speichern, wie ein Dateiname anders als die URL angibt, müssen Sie das -O filenameArgument verwenden. Das macht nur, was Sie wollen, wenn Sie ihm eine einzige URL geben - bei mehreren URLs endet der gesamte heruntergeladene Inhalt in filename.

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

  1. Führen wgetSie den Befehl aus , um die Basis-HTML-Datei (en) mit Ihren Links abzurufen.
  2. Nach URLs suchen;
  3. Für jede URL, die auf endet mp3,
    1. verarbeite URL um einen Dateinamen zu erhalten (zB verwandle dich 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 jetzt müssen Sie herausfinden, wie Sie die Basisdateien abrufen, um Ihre mp3URLs zu finden .

Haben Sie eine bestimmte Site- / Basis-URL im Hinterkopf? Die Schritte 1 und 3 lassen sich anhand eines konkreten Beispiels leichter handhaben.


1

so kann ich die korrekten Namen sehen, während der Download stattfindet.

OKAY. Verwenden Sie wget wie gewohnt. Verwenden Sie das Post-Wget-Skript, das Sie normalerweise verwenden, aber verarbeiten Sie die Ausgabe von Wget so, dass die Augen geschont werden:

#! /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 herunterladen, aber der Rest des Namens wird in hellem Cyan angezeigt.


Dies löst etwas das Problem der angezeigten Dateinamen, aber das OP möchte auch, dass der endgültige Dateiname nicht die Abfragezeichenfolge enthält.
Michael Mior

1

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

mv: './file' und './file' sind dieselbe Datei

Daher überprüfe ich zuerst, ob der Dateiname eine Abfragezeichenfolge enthält, bevor ich die Datei verschiebe:

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

Dies überprüft rekursiv jede Datei und entfernt alle Abfragezeichenfolgen in ihren Dateinamen, falls verfügbar.


0

Schauen Sie sich diese beiden Befehle an, die ich zum Klonen einer Site erstellt habe. Nachdem das Klonen abgeschlossen ist, können Sie den zweiten Befehl ausführen.

Der zweite Befehl durchsucht den gesamten Klon, sucht nach " ? " - Dateimusternamen 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 es in GitHub Gist .)


-2

Noch einfacher ist dies: /unix/196253/how-do-you-rename-files-spezifisch-in-a-list-that-wget-will-use

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


2
Können Sie bitte die relevanten Informationen aus dem Link zitieren, damit wir wissen, welches Material Ihrer Meinung nach diese Frage beantwortet.
Ramhound
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.