
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
複数フォルダをまとめて移動するバッチ
Windows Vista・XP
-
コマンドプロンプトでフォルダを移動させるには?
Windows 7
-
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
-
4
Windowsコマンドプロンプトのmoveコマンドが何度も構文エラーエラーを吐き出す件。
その他(プログラミング・Web制作)
-
5
大量のフォルダからひとつのフォルダにファイルをまとめたい!
その他(ソフトウェア)
-
6
ファイル名を該当フォルダ内から検索して移動
その他(プログラミング・Web制作)
-
7
ワイルドカードを使ってでフォルダを削除
Windows 10
-
8
多数のサブディレクトリ内のファイルを一括コピーする
その他(プログラミング・Web制作)
-
9
沢山のフォルダにあるファイルを上の階層に出すには?
Windows Me・NT・2000
-
10
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
11
moveコマンドで別のドライブにフォルダを移動
その他(OS)
-
12
bat ファイルでフォルダ作成&移動
Windows Vista・XP
-
13
同名フォルダを作成し、そのフォルダに移動するバッチ
その他(プログラミング・Web制作)
-
14
ファイル名の頭5桁と同名のフォルダを自動作成し、移動させる方法はありますか?
Access(アクセス)
-
15
Windowsで指定「以外」のファイルを移動したい
IT・エンジニアリング
-
16
【バッチファイル】ホスト名をファイル名につけたい【変更】
その他(コンピューター・テクノロジー)
-
17
コマンドプロンプトによるフォルダ内のファイル存在有無
UNIX・Linux
-
18
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
-
19
バッチファイルでファイル移動とログ出力
システム
-
20
フォルダを自動作成・移動を複数ファイルに対して行うバッチ処理について
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
CFileDialogの最初のディレクト...
-
Subversionのリポジトリの削除
-
現在位置より2つ上のディレク...
-
makefile でファイルをコピーす...
-
ディレクトリ見たいのですが・・・
-
ファイル選択ダイアログで選択...
-
exec()で他ディレクトリのexeプ...
-
Ethnaの基本設定について
-
Visual C++ 2005 Express Editi...
-
JAVA内で複数のファイルを削除...
-
fopenでファイルが開かない場合...
-
ローカルサーバーでパーミッシ...
-
絶対パス?絶対アドレス?意味...
-
DLL のロードの順序
-
Matlab 指定したディレクトリ...
-
UWSCでファイルのアップロード...
-
環境変数をMakefile内で有効に...
-
renameでのPermission deniedエ...
-
VB2008でFTPでのディ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
Subversionのリポジトリの削除
-
CFileDialogの最初のディレクト...
-
makefile でファイルをコピーす...
-
現在位置より2つ上のディレク...
-
visualstudioでc#のdllができない
-
JAVA内で複数のファイルを削除...
-
rmdirでフォルダが消せません
-
バッチを用いたフォルダの自動移動
-
glob関数で日本語文字が取得で...
-
Subversionで、ファイルをリネ...
-
Makefile.inとMakefile.am
-
O/Rマッパーの選定
-
WSHやVBSについて
-
DLL のロードの順序
-
絶対パス?絶対アドレス?意味...
-
LoadLibraryの戻り値(HMODULE)...
-
ツリーメニューを縮小させたい
-
wordpressの記事をカスタマイズ...
-
アプリケーション・ディレクト...
おすすめ情報