
Windows上のファイル(フォルダ)操作について教えてください。
ある一定の文字列(AAA,BBB等)をもったサブフォルダがtempフォルダに無造作にあるので、
以下のようにフォルダを整理(移動)したいと考えております。
D:
temp
└ AAA_01,AAA_02,BBB 01,BBB 02,CCCxxx,CCCvvv,…
AAA
BBB
CCC
↓
D:
temp
AAA
└AAA_01,AAA_02,…
BBB
└BBB 01,BBB 02,…
CCC
└CCCxxx,CCCvvv,…
手作業では大変だったのでバッチ(forコマンド)で一括処理できないかと、
整理したいフォルダ群があるtempフォルダ(D: \temp)で以下を実行してみました。
for /f %i in (list.txt) do move "%i"* "D:\%i\"
※list.txt は D:> dir /b > list.txt で取得
-----
AAA
BBB
CCC
・
・
・
-----
しかし、完全一致のフォルダ(AAA)は移動できましたが、
文字列を含むフォルダ(AAA_01等)は移動できませんでした。
ワイルドカードの指定もうまくいかず、良い方法がありましたら教えてください。
(VBAのMoveFolderメソッドはワイルドカードが使えるようですが、
list.txt を読み込む方法がわかりませんでした。)
どうぞよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
なんと!
moveがディレクトリのワイルドカードに対応していないのは知りませんでした。
ファイルではなくサブフォルダというのも読み落としていて、失礼しました。
ワイルドカードではなく一意ならばmoveできるようなので、移動したいディレクトリ一覧を使う方法になるかもしれません。
私の書いた内容をもう少し砕きます。
例えば、移動したいディレクトリ名の3文字目までは移動先のディレクトリ等の決めごとがあるならば、移動したいディレクトリから移動先を導き出せるため、moveすることができると思います。
その決めごとでバッチファイルにすれば、「set /?」コマンドに出てくる副文字列を使用できます。
forのループ変数を適当な環境変数に格納し、その環境変数からディレクトリ名の副文字列を得ればmoveコマンドに使用できると思います。
(副文字列の記法からバッチファイル内でしか使えなそうです。)
>dir /b
a.bat
aaa_01
bbb 03
ccc02
>type a.bat
@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir /b') do (
echo %%i
set org=%%i
set dir=!org:~0,3!
echo %dir%
echo move %%i ..\!dir!
)
>a.bat
a.bat
.ba
move a.bat ..\a.b
aaa_01
aa_
move aaa_01 ..\aaa
bbb
bb
move bbb ..\bbb
ccc02
cc0
move ccc02 ..\ccc
>
質問内容では決めごとが一律ではないため、一律にするか、AAAの場合・BBBBの場合等で場合分けした後にそれぞれの決めごとでディレクトリを導き出すとよいと思います。
ただ、私の書いた『「_」の前まで』の決めごとからディレクトリを導き出すことはバッチファイルではできないかもしれません。
「BBB 01」の場合はコマンドが2引き数と解釈してしまうため、一旦「 」を「_」にする等の対策がいると思います。
他の方法としては、ググったところUNIXの同様機能のmvはワイルドカードが使えるので、MinGWをインストールする手もあります。
念のためですが、質問内容の処理は移動先ディレクトリ名が移動したいディレクトリ名と同じになっているため、完全一致ではないディレクトリは移動先ディレクトリが用意されていないために移動されなかったと思います。
詳しいご説明、ありがとうございました。
moveコマンドではディレクトリに対してワイルドカードが使えず、
移動したいディレクトリ名から移動先を導き出すには制約がある(頭~文字からとか、空白の考慮とか)
…とても勉強になります。
なので他の方法としてご提案いただいた、mvコマンドをWindows上で使う方法を試してみました。
結果、無事にmvコマンドで想定の動作が実現できました。
ご教示いただきまして、誠にありがとうございました。
No.1
- 回答日時:
移動先のディレクトリは人が作る等、どこまで人が行うかわからないけど。
moveはディレクトリの作成は行わないため、人が移動先のディレクトリを作っておくと仮定します。
別のアプローチの仕方もあるかもしれません。
dirコマンドで「d:\」ディレクトリ下の移動先ディレクトリ一覧を作成し、そのエントリにワイルドカードを付けたものを移動対象のファイルとして移動するというものです。
例えば、一覧に「AAA」があれば、ファイルのある場所で、「move AAA* ..\AAA」となる。
質問のように移動ファイル一覧を使う方法の場合は、ファイル名のどこまでがディレクトリを意味するのかをそれぞれ決める必要があると思います。
(「AAA_01」は3文字目まで?、「_」の前まで?、「BBB 01」は「 」の前まで?等一律ではないため。)
文字数で決まる場合は、副文字列(「set /?」コマンド参照)を使ってファイル名からディレクトリ名を特定してmoveすればよいと思います。
ご返信ありがとうございます。
おっしゃるとおり、移動先ディレクトリは既に作ってある状況です。
(AAA_01,AAA_02 … 用に AAA 等)
> dirコマンドで「d:\」ディレクトリ下の移動先ディレクトリ一覧を作成し、そのエントリにワイルドカードを付けたものを移動対象のファイルとして移動するというものです。
> 例えば、一覧に「AAA」があれば、ファイルのある場所で、「move AAA* ..\AAA」となる。
私も同じように考えましたが、「move AAA* ..\AAA」のようなワイルドカードの使用は有効ではないようです。
手入力で検証してみました。
(ワイルドカードを使ったフォルダの移動はできない?)
===
D:\test\temp>dir
2019/05/29 09:41 <DIR> .
2019/05/29 09:41 <DIR> ..
2019/05/27 16:04 <DIR> AAA_01
2019/05/27 15:17 <DIR> BBB 02
D:\test\temp>move AAA* D:\test\folder\AAA\
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
D:\test\temp>move AAA_01 D:\test\folder\AAA\ ※
1 個のディレクトリを移動しました。
===
> 質問のように移動ファイル一覧を使う方法の場合は、ファイル名のどこまでがディレクトリを意味するのかをそれぞれ決める必要があると思います。
> (「AAA_01」は3文字目まで?、「_」の前まで?、「BBB 01」は「 」の前まで?等一律ではないため。)
> 文字数で決まる場合は、副文字列(「set /?」コマンド参照)を使ってファイル名からディレクトリ名を特定してmoveすればよいと思います。
もうしわけありません。上記は意図が読み取れませんでした。
D:\test\temp>move AAA_01 D:\test\folder\AAA\ ※ のように移動元フォルダ名(AAA_01)をすべて指定せよということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- Excel(エクセル) ファイル一覧表を使ったファイルの移動 5 2022/08/10 15:37
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
このQ&Aを見た人はこんなQ&Aも見ています
-
複数フォルダをまとめて移動するバッチ
Windows Vista・XP
-
コマンドプロンプトでフォルダを移動させるには?
Windows 7
-
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
-
4
Windowsコマンドプロンプトのmoveコマンドが何度も構文エラーエラーを吐き出す件。
その他(プログラミング・Web制作)
-
5
ワイルドカードを使ってでフォルダを削除
Windows 10
-
6
moveコマンドで別のドライブにフォルダを移動
その他(OS)
-
7
大量のフォルダからひとつのフォルダにファイルをまとめたい!
その他(ソフトウェア)
-
8
沢山のフォルダにあるファイルを上の階層に出すには?
Windows Me・NT・2000
-
9
ファイル名を該当フォルダ内から検索して移動
その他(プログラミング・Web制作)
-
10
多数のサブディレクトリ内のファイルを一括コピーする
その他(プログラミング・Web制作)
-
11
bat ファイルでフォルダ作成&移動
Windows Vista・XP
-
12
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
13
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
-
14
同名フォルダを作成し、そのフォルダに移動するバッチ
その他(プログラミング・Web制作)
-
15
フォルダを自動作成・移動を複数ファイルに対して行うバッチ処理について
その他(プログラミング・Web制作)
-
16
Batch: フォルダ内の特定のファイル以外を全て削除
その他(プログラミング・Web制作)
-
17
【バッチファイル】ホスト名をファイル名につけたい【変更】
その他(コンピューター・テクノロジー)
-
18
異なるファイルに入った複数のファイルを一括で特定のフォルダに移動する方法について
その他(コンピューター・テクノロジー)
-
19
Windowsで指定「以外」のファイルを移動したい
IT・エンジニアリング
-
20
バッチファイルで指定フォルダ以下のフォルダ名を表示
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Subversionのリポジトリの削除
-
MkDir関数
-
CFileDialogの最初のディレクト...
-
FTPコマンドでディレクトリごと...
-
apacheの設定?
-
Apatcheのhttpd.confについて
-
現在位置より2つ上のディレク...
-
図に示す階層構造で,現在のデ...
-
DLL のロードの順序
-
fopenでファイルが開かない場合...
-
execコマンドについて
-
unlink「許可がありません」と...
-
aspのページが表示できません
-
VB.NET 最下位のディレクトリ名...
-
絶対パス?絶対アドレス?意味...
-
レンタルサーバーでPDF出力
-
JAVA内で複数のファイルを削除...
-
str ! = NULL
-
FTPでのファイルとディレクトリ...
-
ファイル選択ダイアログで選択...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
Subversionのリポジトリの削除
-
CFileDialogの最初のディレクト...
-
バッチを用いたフォルダの自動移動
-
visualstudioでc#のdllができない
-
rmdirでフォルダが消せません
-
現在位置より2つ上のディレク...
-
makefile でファイルをコピーす...
-
JAVA内で複数のファイルを削除...
-
http://localhost/に.htaccess...
-
絶対パス?絶対アドレス?意味...
-
VB2008でFTPでのディ...
-
powershell で書いたプログラム...
-
ファイル・ディレクトリ削除を...
-
Subversionで、ファイルをリネ...
-
FTPでのファイルとディレクトリ...
-
Visual C++ 2005 Express Editi...
-
VB.NET 最下位のディレクトリ名...
-
ファイル選択ダイアログで選択...
-
DLL のロードの順序
おすすめ情報