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

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

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

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

Q&A

1回答

2891閲覧

ファイルのフルパスから途中のフォルダ名を変数にする方法

ya0501

総合スコア27

Ruby

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

0グッド

2クリップ

投稿2018/01/17 08:05

###前提・実現したいこと
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

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

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

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

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

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

guest

回答1

0

Ruby でパス名の操作は Pathname を使うと楽です。

こんな感じでしょうか。

rb

1require "pathname" 2require "fileutils" 3 4source_dir = Pathname("c:/tmp/share") 5dest_dir = Pathname("c:/tmp/home") 6 7Pathname.glob(source_dir + "**/*.txt") do |path| 8 top_dirname = path.relative_path_from(source_dir).descend.first 9 new_path = dest_dir + "#{top_dirname}_#{path.basename}" 10 FileUtils.cp path, new_path 11end

いくつかの仮定を置いています。

  • sharehome といったディレクトリーが実在すること。
  • share の直下にはファイルは無く,必ず(ファイル名の一部にすべき)ディレクトリーがあること。
  • ファイル名は *.txt の形であること。
  • コピー後のファイルパスがかぶるばあい,上書きしてもよいこと。

Pathname クラスの relative_path_from, descend, basename といったメソッドについてはリンク先の公式リファレンスマニュアルを見てください。
(もちろん,分からない点があったらお尋ねください)

投稿2018/01/17 08:50

scivola

総合スコア2108

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

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

ya0501

2018/01/19 05:21

ご回答ありがとうございます。 頂いたコードでrbファイルを実行したのですが(仮定は満たす) 期待する動作をしませんでした。 どこで引っかかっているのかお分かりでしょうか。 よろしくお願い致します。
scivola

2018/01/19 06:02

期待する動作とどう違ったのでしょうか。
ya0501

2018/01/23 08:40

"c:/tmp/share"から"c:/tmp/home"へのファイルのコピー、リネームが されませんでした。 よろしくお願い致します。
scivola

2018/01/23 08:55

エラーもなく静かになにもせず終わる感じですか? Pathname.glob の行の次の行に p path を入れるとどうなりますか。 ファイルパスが表示されるようなら,ファイルを拾う(スキャンする)こと自体はうまくいっていて,そのあとの処理ができていないことになります。 何も表示されないようだと,ファイルを拾うことすらできていないことになりますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問