dポイントプレゼントキャンペーン実施中!

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

A 回答 (4件)

ディレクトリ(フォルダ)のような木構造をしているもの全体を処理したいけど


どうしていいか見当がつかないということですか?
一言で言うと「再帰的に処理」をします。

たとえばファイルの名前を出力するだけで考えてみます。

・指定されたディレクトリの一覧を取る。これは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

こんだけです(笑)
まあこれだとディレクトリの名前も出しちゃいますけどね。
    • good
    • 0

#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"

という結果です。
    • good
    • 0

ディレクトリ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"みたいにすればいいです。
不明な点があれば補足で質問してください。
    • good
    • 0

findを使って、shell scriptを作ります。


man findでfindの詳細を勉強してください。
Ruby以外にも、色々な局面で使用できます。

もうちょっと具体的に、実行予定のruby codeをかけば、サンプルコードを提供してくれる人がいるかもしれません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!