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

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

新規登録して質問してみよう
ただいま回答率
85.35%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

4090閲覧

最下層のフォルダを上の階層に移動したい

izuki_y

総合スコア65

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2021/06/24 13:20

編集2021/06/30 10:38

お世話になっております。
タイトルの事で質問させてください。

Windows10で
下記の様に同名のサブフォルダにあるファイルを上位に持ってきたいです。

D:\>tree /f test D:\TEST │ ├─iOS Note │ └─iOS Note │ └─iOS Note │ └─iOS Note │ ├─2 │ │ image-0001.jpg │ │ │ └─1 │ image-0002.jpg │ └─Android Note └─Android Note └─Android Note └─Android Note └─Android Note image-0003.jpg

こんな感じ

D:\>tree /f test D:\TEST │ ├─iOS Note ├─2 │ image-0003.jpg │ └─1 image-0002.jpg │ └─Android Note image-0003.jpg

これをやるに当たって、バッチファイルで取る様にしようと考えました。

  1. 最下層のフォルダパスを取ってきて変数に入れる
  2. 番号リスト変数内で重複しているフォルダがあれば削除して宛先にする
  3. moveで移動させる

みたいな感じで考えていました。
とりあえずフォルダのパスを取って来ることを考えました。
dir / b /s /ad d:\test\でパスは取れました。
こんな感じになりました。

D:\>dir / b /s /ad d:\test\ d:\test\iOS Note d:\test\Android Note d:\test\iOS Note\iOS Note d:\test\iOS Note\iOS Note\iOS Note d:\test\iOS Note\iOS Note\iOS Note\iOS Note d:\test\iOS Note\iOS Note\iOS Note\iOS Note\2 d:\test\iOS Note\iOS Note\iOS Note\iOS Note\1 d:\test\Android Note\Android Note d:\test\Android Note\Android Note\Android Note d:\test\Android Note\Android Note\Android Note\Android Note d:\test\Android Note\Android Note\Android Note\Android Note\Android Note

全てのフォルダが取れました。
色々オプションも変えてみましたが無理でした。

仕方がないので
dir / b /s /ad d:\test\ > folder_path.csvで全パスを取って手動で加工してmove [送り元] [宛先]にすることにしました。

結果は、
Android Note はまぁ上手くいきました。空のフォルダが残りましたがこれは別のコマンドで消せます。

問題はKeikaku iSO Notesです。
いくらやっても構文エラーになります。

D:\>move "D:\test\iOS Note\iOS Note\iOS Note\iOS Note*" "D:\test\iOS Note" ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 D:\>move "D:\test\iOS Note\iOS Note\iOS Note\iOS Note\" "D:\test\iOS Note" 指定されたファイルが見つかりません。

調べてみたところ、moveコマンドのフォルダの移動については既存フォルダが無い場合はエラーになるそうです。
万策つきました。

方法が無いかネット調べてみましたが、1階層下のファイルを引き上げる方法はありますが、最下層フォルダのファイルを引き上げる事を
やっている人はいませんでした。

バッチファイルじゃなくてもRubyでもPythonでもJavaでもPowerShellでも構いません。
解説サイトおよび方法をご存じの方はご教授の程よろしくお願いいたします。

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

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

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

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

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

otn

2021/06/24 14:26

画像が非常に見にくいので、コードブロック中にテキストでコピペして下さい。
izuki_y

2021/06/27 15:53 編集

ご指摘ありがとうございます。 後日対応いたします。 ------- 今週中に対応します
guest

回答1

0

ベストアンサー

検討されたことを無視して、やりたいことをストレートに書くとこんな感じでしょうか。
自ディレクトリ名と、親ディレクトリ名が等しいときに、自分の下のファイルを親に移動して、自ディレクトリを消す。
下から順に処理しないと行けないので、sort /rする。

CMD

1@echo off 2setlocal 3pushd 目的のディレクトリ 4for /f "delims=" %%A in ('dir /b /s /ad ^| sort /r') do ( 5 for /f "delims=" %%B in ("%%~dpA") do call :SUB1 "%%~A" "%%~B" 6) 7exit /b 8 9:SUB1 10set B=%~2 11for /f "delims=" %%C in ("%B:~0,-1%") do if "%~nx1" == "%%~nxC" ( 12 pushd %1 13 for /d %%D in (*) do move "%%~D" .. 14 move * .. 15 popd 16 rd %1 17) 18exit /b

%B:~0,-1%は末尾のバックスラッシュを消すためです。

move先に同一名ファイルが既に存在するとかは想定していません。

投稿2021/06/24 15:16

編集2021/06/24 15:56
otn

総合スコア85901

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

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

izuki_y

2021/06/24 15:33

いつもお世話になっております。 サンプル確認いたしました。 Keikaku Android Noteの方は期待動作通りに動いている事を確認いたしました。 Keikaku iOS Noteはイレギュラー且つ自分のやり方が間違っていたのかもしれません。 変化がありませんでした。 明日、改めて1行ずつ確認いたします。 躓きポイントの指摘まで頂き本当にありがとうございました。 まずはお礼までで失礼いたします。
otn

2021/06/24 15:42

dir /b /s /ad の結果はどうなっていますか?
otn

2021/06/24 15:55

何が違うんだろうと、最初の画像を見ると、罫線とかぶってますが、1 や 2 というディレクトリが中間にあるんですね。それは気づかなかった。 やっぱり画像は駄目ですね。 修正しておきます。
izuki_y

2021/06/27 15:52

ありがとうございました。 自分の意図する動作である事を確認しました。 週末を使って頂いたバッチの動きを解析しており返事が遅れて申し訳ありませんでした。 内容はおおよそ理解出来ましたが、癖が強すぎて写経ですら動かすのに相当苦労しました。 後々Qiitaかブログでこのバッチの動きについて備忘録用に記事を書かせてください。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問