• ベストアンサー

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