質問: ### 前提・実現したいこと rubyまたはバッチファイルを使用し、Windows上で以下のファイル操作を行いたいです。 コピーしたファイルのフルパス途中のフォルダ名を変数にしてファイル名の 先頭にリネームしたい。 ■詳細 例 C:\tmp\share\1234\Nordet.txt C:\tmp\share\1235\aaa\Nordet2.txt C:\tmp\share\1237\bbb\ccc\Nordet3.txt 上記のフォルダからファイルのみを別ディレクトリにコピーし、 以下のようにリネームしたい。 C:\tmp\home\1234_Nordet.txt C:\tmp\home\1235_Nordet2.txt C:\tmp\home\1237_Nordet3.txt C:\tmp\IN\ までは固定、それ以降はフォルダにより番号が変化する。 よろしくお願いします。 ### 該当のソースコード ruby bat
回答: Ruby でパス名の操作は `Pathname` を使うと楽です。 こんな感じでしょうか。 ``` require "pathname" require "fileutils" source_dir = Pathname("c:/tmp/share") dest_dir = Pathname("c:/tmp/home") Pathname.glob(source_dir + "**/*.txt") do |path| top_dirname = path.relative_path_from(source_dir).descend.first new_path = dest_dir + "#{top_dirname}_#{path.basename}" FileUtils.cp path, new_path end ``` いくつかの仮定を置いています。 * `share` や `home` といったディレクトリーが実在すること。 * `share` の直下にはファイルは無く,必ず(ファイル名の一部にすべき)ディレクトリーがあること。 * ファイル名は `*.txt` の形であること。 * コピー後のファイルパスがかぶるばあい,上書きしてもよいこと。 `Pathname` クラスの `relative_path_from`, `descend`, `basename` といったメソッドについてはリンク先の公式リファレンスマニュアルを見てください。 (もちろん,分からない点があったらお尋ねください)