質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

5回答

237閲覧

Rubyの each あるいは each_with_index などについての質問

oyajimemo

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/01/06 02:01

Rubyの each あるいは each_with_index などについての質問

ruby2.3 windows10 使用。
each で扱うファイルの順番は対象フォルダにある順番と異なるのでしょうか。
たとえばあるフォルダに some01.jpg ,some02.jpg,some03.jpg,some04.jpg があり それらにeach 処理をさせファイル名を変更させたいのですが、うまくいきません。確認のため処理中にファイル名を表示させると順番通りに処理していないようで、ファイル名を変更する際に順番がくるってしまう事態になり困っています。

windows8 では問題なかったのですが、なにが問題なのでしょうか。ご教示のほどよろしくお願いいたします。

Dir.glob('*.jpg').each.with_index{|e,i| FileUtils.mv("#{e}", "#{sprintf('%02d.jpg' ,i+1)}") puts "#{e}" #確認 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

あなたの言うファイルの順番とはなにで確認したものでしょうか。

Windowsのエクスプローラなどでは、実際のファイルの順番ではなく、ファイル名でソートされて表示されるようになってますが。

投稿2019/01/06 02:26

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oyajimemo

2019/01/06 02:59

早速のご返答ありがとうございます。ご指摘のようにエクスプローラで見ています。「実際のファイルの順番」の意味が分からず、ネットで調べてみるといろいろ勉強不足なことがありそうです。また質問させていただく際はよろしくお願いします。
guest

0

自己解決

ファイル名を配列で取り、それをソートさせ順位番号を振ってファイル名をその番号に変えることでなんとかしのぐことができました。
みなさん、ご助言ありがとうございました。それぞれじっくり検討させていただきます。

filenames = [] filenums = [] Dir.glob("*.jpg").each{ |x| filenames << File.basename(x) } filenames = filenames.sort! Dir.glob('*.jpg').each.with_index{|x,i| filenums << sprintf('%02d.jpg' ,i+1) } filehash = [filenums,filenames].transpose filehash = Hash[*filehash.flatten] filehash.each{|k,v| FileUtils.mv("#{v}", "#{k}") # puts "#{v}" # puts "#{k}" }

投稿2019/01/06 10:38

oyajimemo

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もし、sum01.jpg~sum99.jpgを01.jpg~99.jpgにしたいなら
以下のようにしてください

ruby

1Dir.glob("*.jpg").each{|e| 2 if /^sum(\d\d).jpg$/ =~ e 3 FileUtils.mv("#{e}", "#{$1}.jpg") 4 puts "#{e}" 5 end 6}

もし、sum999.jpgを999.jpgにしたいなら
(999は任意の0~9の1桁以上の数字)(0,1,01,7777,00012等)
以下のようにしてください

ruby

1Dir.glob("*.jpg").each{|e| 2 if /^sum(\d+).jpg$/ =~ e 3 FileUtils.mv("#{e}", "#{$1}.jpg") 4 puts "#{e}" 5 end 6}

投稿2019/01/06 09:29

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ファイル名に数字が記載されており、それを基に改名させたい
というのならば、不確かな順序に頼るよりも
正規表現による数字の抽出を行った方がよいでしょう。

ruby

1Dir.glob('*.jpg').each{|fn| 2 if /some(?<nums>\d+).jpg/ =~ fn 3 num = nums.to_i 4 FileUtils.mv(fn, '%02d.jpg' % num, verbose: true) 5 else 6 raise "「#{fn}」がパターンに合致していません。" 7 end 8}

投稿2019/01/06 05:27

編集2019/01/06 09:47
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

eachの問題というよりは、Dir.globの結果がエクスローラでみたようにはファイル名を取得して
いないということです。
Dir.globの結果をエクスローラでみたように表示する一例です。
(全ての場合にうまくいくかどうかは判りませんが)

ruby

1def conv(fname) 2 fname =~ /^(.*)(\d+)(.*)$/ 3 return $1,$2.to_i,$3 4end 5Dir.glob("*.jpg").sort_by{|a| conv(a)}.each.with_index{|e,i| 6 puts "#{e}" 7} 8

投稿2019/01/06 03:43

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問