私は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内からの解決策が本当に必要です。
誰かがこれを解明するのを手伝ってくれる?
サーバーが親切な場合は、ダウンロードにContent-Dispositionヘッダーを貼り付けて、クライアントに正しいファイル名を通知している可能性があります。最終的なファイル名のヘッダーをリッスンするようにwgetに指示するのは、次のように簡単です。
wget --content-disposition
この機能を使用するには、新しいバージョンのwgetが必要です。
「/ etc/passwd」というファイル名を要求するサーバーをどれだけうまく処理できるかはわかりません。
大きなバッチを処理した後、クエリ文字列を無視するように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 .)>
すべてのファイル名からクエリ文字列を再帰的に削除します。
wget
をURLで指定されたものとは異なるファイル名で保存するには、-O filename
引数を使用する必要があると思います。これは、単一のURLを指定した場合にのみ必要なことを実行します。複数のURLを使用すると、ダウンロードされたすべてのコンテンツは最終的にfilename
になります。
しかし、それが本当に答えです。すべてを1つのwget
コマンドで実行する代わりに、複数のコマンドを使用します。これでワークフローは次のようになります。
wget
を実行して、リンクを含むベースHTMLファイルを取得します。mp3
、のForeach URLhttp://foo/bar/baz.mp3?gargle=blaster
をbaz.mp3
に変換しますwget <URL> -O <filename>
を実行しますこれで問題は解決しましたが、mp3
URLを見つけるためにベースファイルを取得する方法を理解する必要があります。
特定のサイト/ベースURLを念頭に置いていますか?ステップ1と3は、具体的な例を使用すると処理が簡単になります。
ダウンロードが行われているときに正しい名前を確認できます。
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
ダウンロードすると、名前の残りの部分は明るいシアンで表示されます。
彼のコードは常に次のようなエラーメッセージを作成したため、@ Gregory Wolfと同様のアプローチをとっています。
mv: './file'と './file'は同じファイルです
したがって、ファイルを移動する前に、まずファイル名にクエリ文字列があるかどうかを確認します。
for f in $(find $1 -type f); do
if [ $f = ${f%%\?*} ]; then continue; fi
mv "${f}" "${f%%\?*}"
done
これにより、すべてのファイルが再帰的にチェックされ、ファイル名にあるクエリ文字列があれば削除されます。
サイトを複製するために作成したこれら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 で参照してください。)