crulでリスト記載のURLの一部をファイル名に

このQ&Aのポイント
  • Mac環境(OS10.8.5)のターミナルを利用して、curlでリスト記載のURLの一部をファイル名にする方法を教えてください。
  • 質問者はプログラミングの知識がなく、ネットで調べても解決できなかったため、皆さんの知恵を求めています。
  • url.txtには複数のURLが記載されており、それぞれのURLの末尾の数値部分をファイル名として保存したいと思っています。しかし、全てのURLの末尾が同じであるため、ファイル名の作成に苦労しています。アドバイスをお願いします。
回答を見る
  • ベストアンサー

crulでリスト記載のURLの一部をファイル名に

Mac環境(OS10.8.5)のターミナル利用 プログラミングは知識が無く、ネットで調べても自力では解決しなかったので、皆様のお知恵を頂ければ幸いです。 「url.txt」には下記のようなURLが複数記載されています。 ~.com/test/1594/data ~.com/test/6416/data ~.com/test/5168/data ※「1594」「6416」などの個所は、実際には規則性の無いランダムの10桁の数字となっております url.txtに記載されているURLについてですが、ここでは「~」を使って省略していますが、実際は各行にはhttpから始まるアドレスが記載されています。 cat test/url.txt | xargs -P3 -t -n1 curl -O 上記の状態では、出力されるファイルは「test」と言うファイル名のファイルが1つしか出来ません。(全て上書き保存されてしまうため) これを「1594.html」「6416.html」「5168.html」と言うように、1つ1つファイルを保存したいと思っております。 url.txtに記載されているURLの末尾が、全部違っていれば問題は無かったのですが、末尾が全部同じのため保存時のファイル名でつまづいてしまっています。 ここまで何とか自力で調べて出来たのですが、あと一歩をアドバイス頂ければ助かります。 何卒、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

> 「xargs」を利用したのは、リストに記載されているURLが数百以上あるので、マルチスレッドのように同時に処理させたいと思い、「xargs」と言うコマンドを見つけて利用する事に致しました。 -P オプションですね。正確にはマルチプロセスですが並行動作は同じです。マルチスレッドは1つのプロセス内で複数のスレッドを並列動作させる事です。表面上はあまり区別しなくていいですが、プログラマは厳密に区別します。 > わがままな希望だと思いますが、教えて頂いたプログラムに「xargs」などを利用して、マルチスレッドで並行処理させる事は可能でしょうか? wrapper script 用意するのが簡単でしょう。まず curl を呼び出すシェルスクリプトを作成し (ファイル名はなんでもいいですが) ----- curl.sh #!/bin/sh i="$1" o="${i%/*}" exec curl -o "${o##*/}.html" "$i" ------ chmod +x curl.sh cat test/url.txt | xargs -P3 -t -n1 ./curl.sh 元の xargs に渡すように段階踏めばいいです。-n1 してるので $1 しかみてません。

vvv_052
質問者

お礼

お礼が遅れてしまい、大変申し訳ありません。 教えて頂いたプログラムで実行したところ、多段スレッドのように同時に処理する事が確認出来ました。 数日調べても自力では解決出来なかった事なので、大変感謝しております。 まだいくつか自力で解決出来ないか頑張っている事もありますので、自力解決が難しくなった時は、またここでご質問させて頂こうと思います。 ありがとうございました。

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

> url.txtに記載されているURLについてですが、ここでは「~」を使って省略していますが、実際は各行にはhttpから始まるアドレスが記載されています。 ~ は $HOME (ホームディレクトリ) を意味するので、勘違いされやすいので使わない方がいいです。質問文良く読まないと気付かない。 > これを「1594.html」「6416.html」「5168.html」と言うように、1つ1つファイルを保存したいと思っております。 無理に xargs 使わなくとも、URL の後ろから2番目を取り出して -o に渡してやれば良さそうだけど、 cat test/url.txt | while read i; do o=${i%/*}; curl -o "${o##*/}.html" "$i"; done もちろん試してはいない。${i%/*} や ${o##*/} はシェルのマニュアル参照。sh や bash 前提

vvv_052
質問者

お礼

trapezium 様、アドバイスありがとうございます。 プログラミングの知識ゼロの状態から、数日かけて自力でここまで持ってきていたので、「~」がホームディレクトリを意味する事も知りませんでした。 大変申し訳ありませんでした。 教えて頂いたコマンドを実行した所、問題無く思っていたような結果を得る事が出来ました。 ありがとうございます。とても感謝しております。 「xargs」を利用したのは、リストに記載されているURLが数百以上あるので、マルチスレッドのように同時に処理させたいと思い、「xargs」と言うコマンドを見つけて利用する事に致しました。 わがままな希望だと思いますが、教えて頂いたプログラムに「xargs」などを利用して、マルチスレッドで並行処理させる事は可能でしょうか? お手数をおかけしますが、ご教授頂ければ幸いです。 よろしくお願い致します。

vvv_052
質問者

補足

◆訂正◆ 質問で『出力されるファイルは「test」と』と記載しておりましたが、これは「data」の間違いでした。 わざわざ訂正する必要も無いかもしれませんが、私のような知識が無い人がこの質問を参考にした時に勘違いしてしまわないように、訂正を致します。 ◆補足◆ ご回答を頂く間に、自分でも他に方法が無いか調べていた事も追記致します。 出力指定で「>>」を記入すると上書きされずに、1つのファイルに追記されるのが分かりました。 cat test/url.txt | xargs -P2 -t -n1 curl >> testdata.html 上記の方法でも1つのファイルに結合された状態で、DLできる事が確認出来ました。 最悪この方法で何とかするしかないと思っていたのですが、trapezium 様からご教授して頂いたプログラムで1つ1つ分割して保存する事が出来たので、1つの結合ファイルとして保存する必要が無くなって良かったです。

関連するQ&A

  • curlでファイル名にURLの一部を利用するには?

    Mac環境(OS10.8.5)のターミナル利用 プログラミングは知識が無く、ネットで調べても自力では解決しなかったので、皆様のお知恵を頂ければ幸いです。 「url.txt」には下記のようなURLが複数記載されています。 ~.com/test/1594/data ~.com/test/6416/data ~.com/test/5168/data ※「1594」「6416」などの個所は、実際には規則性の無いランダムの10桁の数字となっております cat test/url.txt | xargs -P3 -t -n1 curl -O 上記の状態では、出力されるファイルは「test」と言うファイル名のファイルが1つしか出来ません。(全て上書き保存されてしまうため) これを「1594.html」「6416.html」「5168.html」と言うように、1つ1つファイルを保存したいと思っております。 どのように記述をすれば良いのかアドバイスを頂けますでしょうか。 何卒、よろしくお願い致します。

  • curlで外部ファイル記載を1行ずつ処理するには?

    いつもお世話になっております。 よろしくお願い致します。 プログラムの知識が無いため、自力で調べて何とか下記の所までテストが出来ております。 curl 'https://www.hogehoge.com/aaaaa/bbbbb/ccccc/ddddd/page[8-12]' -H 'Host: www.hogehoge.com' -o "page#1.html" ※実際は上記には「Referer」や「User-Agent」など付いていますが、長くなってしまうのでここでは削除してあります。 実際にやりたい事は、上記の[8-12]の個所に、連番では無い様々な数字を入れて実行したいと思っています。 入力する数字が1行ごとに記載されている外部ファイルを読み込んで、[8-12]の個所に代入して実行するにはどのようにすれば良いでしょうか? 例えば外部ファイル(test.txt)には下記のように記載されています。 41433135 25342545 54236462 33436336 57375353 ※もっと続きます 1行ずつ読み込んで「41433135.html」「25342545.html」「54236462.html」などと、それぞれファイルに保存するようにしたいです。 ***.shと言うファイルにプログラムを作って記述すれば、上記の事ができそうな気がしますが、いろいろと調べてみても私ではどのように応用して記述すれば良いのか分からずお手上げな状態です。 おそらくプログラムに詳しい方であれば、この問題はすぐに解決できるレベルのような気がしますが、記述方法を教えて頂ければ助かります。 私の環境はMacで、ターミナルを利用しております。 すでにこの問題で2週間ほど調べてみましたが、もう限界な状態です。 どなたかお助け下さい。 何卒、よろしくお願い致します。

  • リストを読み込んでファイル名を書換るバッチファイル

    バッチファイル(test.bat)で、 変更前のファイル名が1行に1つずつ書かれたテキストファイル1(no1.txt)と 変更後のファイル名が1行に1つずつ書かれたテキストファイル2(no2.txt) を読み込んで、 no1.txtのn行目のファイル名のファイルを、 no2.txtのn行目のファイル名に書き換える バッチファイルを作りたいのですが、 (n=1,2,3,4…行数) どのように記述すればよいでしょうか。 具体的には、 フォルダAに 123.txt 456.txt 789.txt というファイルが入っていたとして、 no1.txtのファイルには、 123.txt 456.txt 789.txt no2.txtのファイルには、 ABC.txt DEF.txt GHI.txt が書かれていて、 test.batを実行すると、 フォルダAの中のファイル名が 123.txt => ABC.txt 456.txt => DEF.txt 789.txt => GHI.txt というようにリネームされるようにしたいです。 よろしくお願いします。(Windows10)

  • ExcelのマクロでSheetに記載のファイル名に変更するには

    Excel2003のマクロで、Sheet1のセルb1~b***(***の値はマクロで末尾を認識させたい)に記載されているファイル名をDドライブのフォルダ名「TEST1」から検索してAAのセルC1~C***に記載のファイル名にリネームするマクロで、「TEST1」フォルダにSheet1のセルに記載のファイルがない場合はエラーにしないで無視して次に進むようにしたいのですが、初心者でうまくできません。ご指導宜しくお願いします。

  • バッチファイル 現在のフォルダ名をファイル名に置き換える

    こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.txtファイルを、現在の フォルダ名を取得して、別フォルダにリネームして 格納するバッチファイルを作成したいと考えています。 for文を繰り返し使わなければいけないことはわかっているのですが、それをどう表現していいのか全然わかりません。 例えば、 データ取得元として以下のファイルがあったら C:\temp\20100101\data1.txt C:\temp\20100101\data2.txt C:\temp\20100101\data3.txt C:\temp\20100102\data1.txt C:\temp\20100102\data2.txt C:\temp\20100103\data1.txt C:\temp\20100103\data2.txt これを別フォルダに、現在のフォルダ名をファイル名にくっつけて 以下のように一つのフォルダに纏めて格納したいと思っています。 ファイルの中身はそのままコピーしたいので、どこかでcopyコマンド を使うかもしれないです。 C:\test\data1_20100101.txt C:\test\data2_20100101.txt C:\test\data3_20100101.txt C:\test\data1_20100102.txt C:\test\data2_20100102.txt C:\test\data1_20100103.txt C:\test\data2_20100103.txt 実装方法として以下までは考えましたが、これ以上は無理そうです。 rem set A=C:\temp rem set B=C:\test for %%A in (C:\temp\) do ( if not "%%A"=="" ( pushd "%%A" for /d %%B in (*) do ( if not "%%B"=="" ( pushd "%%B" for /d %%C in (*) do ( if not "%%C"=="" ( pushd "%%C" ) ) ) ) popd? ) ) 申し訳ありませんが、お助け願います。

  • 指定文字を含むファイル名の取得

    こんばんは、質問させてください。 今あるディレクトリのファイルを取得しようと考えています。ですが、取得したいファイルはファイル名末尾が"tmp"となったものだけを取得したいと考えています。 $dir = "/home/httpd/test/"; while($fnm[] = readdir($dir)); closedir($dir); sort($fnm); reset($fnm); while($a = each($fnm)){ if(($a[1] != ".") and ($a[1] != "..") and ($a[1] != "")){ $file_data[] = $a[1]; } } ってとこまでしかわからず、欲しくないファイル名まで$file_dataに入ってしまいます。 aaaaa_1111.txt(取得したくない) aaaaa_1111.txt.tmp(取得したい) aaaaa_1111.tmp.txt(取得したくない) 末尾が"tmp"のみ欲しいです。 すみませんが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • フォルダ内のファイル名の末尾7文字を一括置換

    フォルダ内のファイル名の末尾7文字を一括置換 こんにちは、VBA初心者です。 D:\test フォルダに test_jp.txt、sample_jp.txt、testsample_jp.txt といった名前のファイルが格納されているとします。 これらのファイル名の「_jp.txt」の部分(末尾7文字の部分)を「_en.txt」に置換したいのですが、うまくいきません。 以下のようなプログラムを書いてみたのですが、どこがいけないのでしょうか。 ※「実行時エラー53 ファイル名が見つかりません。」となります。 ※ VBEのローカルペインによると、エラー時には filename 変数に sample_jp.txt が格納されています。 Sub ファイル名置換() Dim fileName As String fileName = Dir("D:\test\*_ja.txt") Do Until fileName = "" Name "D:\test" & fileName As "D:\test" & Left(fileName, Len(filename) - 7) & "_de.txt" filename = Dir() Loop End Sub

  • fgets()でURLを読み込むとエラーになる

    -----url.txt----- http://www.google.co.jp http://www.goo.ne.jp/ ----------------- -----test.php------ $urltxt = fopen("url.txt", "r"); $url = fgets($urltxt); $html = fopen($url, "r"); -------------------- のように、各行にURLが書いてあるテキストファイルを一行ずつ読み込んで、それを引数にしてfopen()したところ、 全てfailed to open stream: HTTP request failed! HTTP/1.0 404 Not Foundとなってしまいます。 print($url)では正しくURLが出力されますし、$urlへの代入を直接$url = "http://www.goo.ne.jp/"としてやれば正常に動作するので、何が原因か分かりません。 テキストファイルは全て半角英数のアドレスのみで、シフトJISで保存しています。 どなたか原因が分かる方、ご教授ください。

    • ベストアンサー
    • PHP
  • フォルダ名をファイル内に記載

    もしご存知の方いらっしゃったら、教えてください。 「フォルダ名を、 そのフォルダの中にあるテキストファイルに記載する。」 ことができるソフト等はありますでしょうか? -フォルダ名が「入学式」 -「入学式」フォルダに「01.txt」というファイルが入っている。 -「01.txt」を開かずに、「01.txt」内の冒頭(もしくは指定した箇所)に「入学式」という文字を追加する。 できたらこの操作を、 複数のフォルダに対して一度に行いたいのです。 「入学式」フォルダ内のテキストには「入学式」を追加。 「卒業式」フォルダ内のテキストには「卒業式」を追加。 ・・・・ を一度に行いたいのです。 どうぞよろしくお願いいたします。

  • id,urlというテーブルにおいて、url中のファイル名が同じものを抜

    id,urlというテーブルにおいて、url中のファイル名が同じものを抜き出したい。 こんなテーブルがあります。 id url 1 http://okwave.jp/test/abc.wav 2 http://okokok.jp/456.jpg 3 http://okokok.jp/abc.wav ......続く urlは必ずファイル名.拡張子で終わっています。 これらのURL中のファイル名.拡張子が同じもの(上のid1とid3などが例です)を抜き出して、 SELECT ファイル名,COUNT(同じだった数) というふうに表示させたいのですが、どのようなSQLを組めばよいでしょうか? PHPでも構いません。 ご教授願います。

    • ベストアンサー
    • MySQL

専門家に質問してみよう