web-dev-qa-db-ja.com

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

私は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内からの解決策が本当に必要です。

誰かがこれを解明するのを手伝ってくれる?

33
Keith Twombley

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

wget --content-disposition

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

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

24
Filox

大きなバッチを処理した後、クエリ文字列を無視するように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 .)>

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

18
Gregory Wolf

wgetをURLで指定されたものとは異なるファイル名で保存するには、-O filename引数を使用する必要があると思います。これは、単一のURLを指定した場合にのみ必要なことを実行します。複数のURLを使用すると、ダウンロードされたすべてのコンテンツは最終的にfilenameになります。

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

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

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

特定のサイト/ベースURLを念頭に置いていますか?ステップ1と3は、具体的な例を使用すると処理が簡単になります。

4
quack quixote

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

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ダウンロードすると、名前の残りの部分は明るいシアンで表示されます。

1
ayrnieu

彼のコードは常に次のようなエラーメッセージを作成したため、@ Gregory Wolfと同様のアプローチをとっています。

mv: './file'と './file'は同じファイルです

したがって、ファイルを移動する前に、まずファイル名にクエリ文字列があるかどうかを確認します。

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

これにより、すべてのファイルが再帰的にチェックされ、ファイル名にあるクエリ文字列があれば削除されます。

1
KittMedia

サイトを複製するために作成したこれら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 で参照してください。)

0
Vijay Padhariya