ダウンロードしたファイルの名前をwgetに変更して、クエリ文字列を含めないようにするにはどうすればよいですか?


32

私は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に質問を投稿してください。
デニスゾーテマン2009年

3
@TutorialPointなぜですか?質問は、wget-way-to-do-itを探しているので、ここに移行するだけです。
いんちきのキホーテ

まあ、何ツー行い、それを内-wgetの-方法はありません
ayrnieu

1
@ayrnieu:1つのコマンドではありません。ヘルパーなしではありません。確かに、n + 1個のwgetコマンド(それ以上ではないにしても)で確実に実行できます。
いんちきキホーテ

回答:


24

サーバーが親切である場合、クライアントに正しいファイル名を通知するContent-Dispositionヘッダーをダウンロードに貼り付けている可能性があります。最終的なファイル名についてそのヘッダーをリッスンするようにwgetに指示するのは次のように簡単です:

wget --content-disposition

この機能を使用するには、wgetの新しいバージョンが必要です。

「/ etc / passwd」というファイル名を要求するサーバーをどれだけうまく処理できるかわかりません。


ある状況では間違いなく機能するので、この答えに問題はありません。残念ながら、タイプバージョニングが含まれる一部のクラウドフロントサービスページに関しては機能しませんでし?v=blahた。これらなしでドキュメントをリクエストするクラウドフロント固有の方法があるかもしれませんが、わかりませんが、見つけられなかったので、そのような場合には他の答えのようなものが必要になるでしょう。(もし誰かがv=弦を
剥がす-Cloudfront

17

大きなバッチを処理した後wget、クエリ文字列を無視するよう指示する必要があることに気付きました。二度とやりたくなかったので、私に合ったこのスクリプトを作成しました。

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

rmqstrchmod +x rmqstr 構文のようなファイルに入れてください:./rmqstr <directory (defaults to .)>

すべてのファイル名から再帰的にクエリ文字列を削除します。


2
私は `-name" \? "`を追加して、必要なファイルだけに制限する部分を見つけます:)
Arkadiusz 'flies' Rzadkowolski

4

私が得るために、考えるwgetURLの指定よりも、別のファイル名で保存し、使用する必要がある-O filename引数を。それは、単一のURLを指定したときに必要なことだけを行います。複数のURLを使用すると、ダウンロードされたすべてのコンテンツがになりfilenameます。

しかし、それは本当に答えです。1つのwgetコマンドですべてを実行するのではなく、複数のコマンドを使用します。これで、ワークフローは次のようになります。

  1. 実行wgetして、リンクを含むベースHTMLファイルを取得します。
  2. URLの解析。
  3. で終わるforeachのURL mp3
    1. 例えばターン(ファイル名を取得するためにURLを処理するhttp://foo/bar/baz.mp3?gargle=blasterbaz.mp3
    2. (オプション)ファイル名が存在しないことを確認します
    3. 走る wget <URL> -O <filename>

これで問題は解決しますが、mp3URL を見つけるためにベースファイルを取得する方法を理解する必要があります。

特定のサイト/ベースURLを念頭に置いていますか?手順1と3は、具体的な例で簡単に処理できます。


1

そのため、ダウンロードが行われているときに正しい名前を確認できます。

OK。通常どおりwgetを使用します。通常使用するpost-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、ダウンロード時に引き続き表示されますが、残りの名前は明るいシアンで表示されます。


これにより、表示されるファイル名の問題は多少解決されますが、OPは最終的なファイル名にクエリ文字列を含めないことも望んでいます。
マイケルMior 14

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

サイトを複製するために作成したこれら2つのコマンドを見てください。複製が完了したら、2番目のコマンドを実行できます。

2番目のコマンドは、クローン全体を調べ、「」ファイルパターン名を検索し、ファイル名からクエリ文字列を削除します。

# 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番目のバージョンを参照してください。


2
リンクから関連情報を引用してください。どの資料がこの質問に答えていると思いますか。
ラムハウンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.