• ベストアンサー

Rubyでフォルダ内にあるファイル全てに上書きしたい場合

Rubyの勉強中で、ファイルの書き込みは理解できました。ファイルをオープンして書き込んで閉じる。これが例えば、あるフォルダに100ファイルあり、そのフォルダの中にサブフォルダがあり、さらにサブフォルダがあり・・・というようにあるフォルダ以下全てのファイルに文字列を書き込みたい場合、どのような処理が必要になるんでしょうか?

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ディレクトリ(フォルダ)のような木構造をしているもの全体を処理したいけど どうしていいか見当がつかないということですか? 一言で言うと「再帰的に処理」をします。 たとえばファイルの名前を出力するだけで考えてみます。 ・指定されたディレクトリの一覧を取る。これはOKですか? 無事一覧が取れたら、その要素を一つ一つ調べます。そのとき 1. ファイルだったら → その名前を出力します 2. ディレクトリだったら → そのディレクトリに対して 今自分がやったことを適用します。 つまり、 def put_names(path) files = 指定ディレクトリ(path)のファイル/ディレクトリ一覧 #filesは配列なので files.each do |f| fがファイルなら puts f fがディレクトリなら put_names( path + f ) end end のような感じです。 ファイルに対して何か操作したいのなら、上記でファイル名を出力している ところを目的の操作をするメソッドを呼ぶなりしてやればよいです。 ところで自分で勉強のためにスクリプトを組むのが目的ではなく そういう処理のやり方がわかればよいというのなら、 require 'find' Find.find('c:/user/home/') do |x| puts x end こんだけです(笑) まあこれだとディレクトリの名前も出しちゃいますけどね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#223623
noname#223623
回答No.4

#3です。実行結果を書き忘れました。 $ ruby sample.rb "dir1/file1.txt" "dir1/file2.html" "dir1/dir2/file3" "dir1/dir2/dir5/file9.txt" "dir1/dir2/dir3/file4.html" "dir1/dir2/dir3/file5.txt" "dir1/dir2/dir4/file8.html" "dir1/dir2/dir4/file6.html" "dir1/dir2/dir4/file7.txt" という結果です。

全文を見る
すると、全ての回答が全文表示されます。
noname#223623
noname#223623
回答No.3

ディレクトリdir1以下を再帰的に検索して、存在するファイルの名前を表示するサンプルです。ファイルへの書き込みは分かってらっしゃるようなので省略して簡単にしました。ちなみにdir1以下は次のようになっているとします。 $ find dir1 dir1 dir1/file1.txt dir1/dir2 dir1/dir2/dir5 dir1/dir2/dir5/file9.txt dir1/dir2/dir3 dir1/dir2/dir3/file4.html dir1/dir2/dir3/file5.txt dir1/dir2/dir4 dir1/dir2/dir4/file8.html dir1/dir2/dir4/file6.html dir1/dir2/dir4/file7.txt dir1/dir2/file3 dir1/file2.html # ----ここからサンプルスクリプト------------------------------- # globの引数が検索パターン。**/の部分が重要 Dir.glob("dir1/**/*").each{|file|  next if test(?d, file) # ディレクトリだったら次のループ  p file } # ----サンプルスクリプト終わり--------------------------------- ファイルの拡張子を指定するなら"dir1/**/*.txt"みたいにすればいいです。 不明な点があれば補足で質問してください。

全文を見る
すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

findを使って、shell scriptを作ります。 man findでfindの詳細を勉強してください。 Ruby以外にも、色々な局面で使用できます。 もうちょっと具体的に、実行予定のruby codeをかけば、サンプルコードを提供してくれる人がいるかもしれません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ある拡張子のファイル全てを上書きするソフト

    あるフォルダにある全てのフォルダ内にある、特定の拡張子のファイルを、指定した同じ拡張子のファイルに、(中身は問わず)置き換えたいのですが、何か良いソフトはありませんか。 例えば、Aというフォルダ内のa00からa99までのサブフォルダ内にある、*.cgiというファイルを特定の●●.cgiに全て置換(上書き保存すること)したいのです。ちなみに、*.cgiというファイルは全て異なるため、ファイル内の複数文字列を置換するソフトは使えません。。 どうぞ、よろしくお願いいたします。

  • サブフォルダを含むある拡張子の複数のファイル全てを、指定したファイルに置換(上書き)するソフト

    あるフォルダの配下の全てのフォルダ内にある、特定の拡張子のファイルを、指定した同じ拡張子のファイルに、(中身は問わず)置き換えたいのですが、そのニーズに対応したソフトをご存知でしたら、教えて下さい。 例えば、Aというフォルダ内のa00からa99までのサブフォルダ内にある、*.cgiというファイルを特定の●●.cgiに全て置換(上書き保存すること)したいのです。ちなみに、*.htmというファイルは全て異なる場合がありますので、ファイル内複数文字列の置換ソフトは使えません。。

  • Ruby(on Windows) でUTF-8

    Windows上でRuby使っています。 NetBeansで勉強していて、ファイルはすべてUTF-8で書くようにしています。 以下のコードのように、あるファイルを保存するプログラムを書いて、日本語ファイル名で保存したとき(この場合、ファイル名はUTF-8の文字列になるんですよね。)、 (1)と、(2)で同じファイル名の出力を期待しているんですが、名前が変わってしまいます。なぜでしょうか。 Windows上では、ファイル名はShift-JISなどに変換してから保存しないとうまくいかないのでしょうか。 saving_folder = "C:/testrubyfolder/" filename = "ユニコードです" puts filename #←(1) open(saving_folder + filename , "w"){|file| file << "test" } puts Dir.entries(saving_folder) #←(2)

  • エクセルでフォルダとファイルを作りたい

    お世話になります。 エクセル2007で質問です。 下記のような表をエクセルで作り、A列の名称でフォルダを作り、 そのフォルダの中にすべて同じファイル名のテキストファイルを作り、 その内容をB列の文字としたいのですが、マクロなどでの作成方法を教えてくだい。 A列 B列 a1  ああああああ a2  いいいい a5  かかかかか いままで使っていたマクロはテキストのファイル名がすべてバラバラだった ので同じフォルダ内に書き出していましたが、変更があり同じファイル名で内容が 違うデータが必要となってしまいましたので、違う名称のフォルダの中に、 同じ名称のテキストデータを格納したいと思っています。 テキストデータの名称は何でもいいです。 作成するデータの数は決まっていなく、最大で1000くらいあります。 ぜひ、ご教授お願いします。

  • バッチファイルでrubyの引数の*?をエスケープ

    バッチファイルの中でruby に渡す引数の文字列の中のワイルドカードをエスケープするにはどうしたらいいでしょうか。例えば、 for %%I in (aa* b?b) do ruby hoge.rb %%I のような感じです。括弧内のそれぞれを、一つの文字列として渡したいのです。 Windows7 32 bit版または64bit版です。

    • ベストアンサー
    • Ruby
  • rubyのsub、gsubを使った文字列の置換について

    rubyによる文字列の置換でちょっと困っています。 例えば text = "ABCDABCEFG" という文字列があったとします。 その中の"ABC"の部分を"あいう"と置き換える場合 text = text.gsub(/ABC/, "あいう") で text = "あいうDあいうEFG" と置換できるはずです。 以上のような操作は問題ないのですが 置換対象と置換後の文字列を以下のように定義して subに放り込むということは出来ないのでしょうか。 置換前文字列:mae = "ABC" 置換後文字列:ato = "あいう" text = text.gsub(/mae/, ato) でもこれだと置換対象が"mae"という 文字列になってしまいますよね・・・ そもそもこのような機能はrubyにはないのでしょうか。 でも無いとかなり不便だと思いますが・・・ 現在何十万行のcsvファイルを数千行の置換文字列対応表 をつかっていっぺんに処理しようとしまして 以上のような方法をとろうとして詰まっています。 どなたか詳しい方ご教授よろしくお願いします。

  • サブフォルダ内含め全てのファイル名を一括置換するw

    サブフォルダ内含め全てのファイル名を一括置換するwindowsバッチ処理について ファイル名の「YYYYMM」部分を一括で変換したく以下の様なバッチ文を記載しました。 しかし置換処理がうまくいかず、ファイル名の後ろに入力文字列がくっついてしまいます。 set /p YYYYMM="年月を入力してください(yyyymm形式):" echo %YYYYMM% for /r %%f in ( * ) do call :sub %%f %YYYYMM% pause exit /b :sub echo %2 set fname=%~nx1 set fname=%%fname:YYYYMM=%2%% echo %fname% ren %1 %fname% goto :EOF 環境上、ファイル名リネームソフトやWindows Powershellを使うことができないため、何とかバッチ処理で楽をしたいのですがかなり煮詰まってしまい。。。 どなたかアドバイスをお願いできないでしょうか。 よろしくお願いいたします。

  • フォルダ内の全てのファイルを降順で並べ替え

    VBAは本を入門書を読み始めたばかりの初心者です。 一つのフォルダ内にエクセルファイルとcsvファイルが混在(400くらいずつ)あります。このうちエクセルファイルのみ降順で並べ替えをしたいと思います。データの範囲はA1:I501で1行目は見出しでA列は日付が入っているのですが、日付が昇順で入っているため日付を基準にして降順にしたいです。全てのファイルにシートは一つしかありません。 マクロの記録で作成したところ Sub 並べ替え降順() ' ' 並べ替え降順 Macro ' ' Columns("A:A").ColumnWidth = 10.63 '先ずA列の幅を整える Range("A1:I501").Select ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range("A1"), _ SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(1).Sort .SetRange Range("A2:I501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub こんな感じになったのですが、これをフォルダ内の全てのエクセルファイルにおなじ処理をするにはどうしたらよいのでしょうか?詳しい方いらっしゃいましたらどうぞよろしくお願いします。

  • メインフォルダへ出てしまったファイルを元に戻すには

    どういう処理をやったのかはわかりませんが、サブフォルダにあったはずのファイルがその上位のメインフォルダへ全て、移動してしまいました。 サブフォルダは数十あり、その全てのファイルは一千近くあります。 これらを元通りにする手段はないでしょうか? 手動で戻すのはもちろん可能ですが、いかんせん、時間がかかりすぎます。 よろしくお願い致します。

  • Rubyで外部ファイル内の文字列を削除したい

    RubyでTeXファイルを出力しようとしているのですが、 追加書き込みをする際に、End Of File の前の一番最後の文字列 である「\end{document}」が邪魔なので削除したいのですが、どうしても 案が見つかりません。 なにか良い方法をご存知の方はぜひご教授ください。おねがいします。