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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
複数フォルダをまとめて移動するバッチ
Windows Vista・XP
-
コマンドプロンプトでフォルダを移動させるには?
Windows 7
-
大量のフォルダからひとつのフォルダにファイルをまとめたい!
その他(ソフトウェア)
-
-
4
moveコマンドで別のドライブにフォルダを移動
その他(OS)
-
5
bat ファイルでフォルダ作成&移動
Windows Vista・XP
-
6
バッチファイル 二つ上のディレクトリのパス取得
その他(プログラミング・Web制作)
-
7
Windowsコマンドプロンプトのmoveコマンドが何度も構文エラーエラーを吐き出す件。
その他(プログラミング・Web制作)
-
8
異なるファイルに入った複数のファイルを一括で特定のフォルダに移動する方法について
その他(コンピューター・テクノロジー)
-
9
ファイル名を該当フォルダ内から検索して移動
その他(プログラミング・Web制作)
-
10
バッチファイルでファイル移動とログ出力
システム
-
11
同名フォルダを作成し、そのフォルダに移動するバッチ
その他(プログラミング・Web制作)
-
12
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
13
.batでファイル名から抽出してフォルダを作成しコピーする
その他(プログラミング・Web制作)
-
14
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
15
ワイルドカードを使ってでフォルダを削除
Windows 10
-
16
特定フォルダ内のファイルを自動で移動するソフト
フリーソフト
-
17
ファイルが移動できない(しばしば)
Windows Vista・XP
-
18
ディレクトリ名変更してコピーするバッチ
その他(プログラミング・Web制作)
-
19
一定のファイル数ごとにフォルダ振り分けがしたい
フリーソフト
-
20
DOSコマンドでファイルをコピーできない。
その他(パソコン・スマホ・電化製品)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチを用いたフォルダの自動移動
-
現在位置より2つ上のディレク...
-
/usr/local/lib/phpとはどうい...
-
FTPコマンドでディレクトリごと...
-
ファイルの更新日時でのソート
-
Subversionのリポジトリの削除
-
exec()で他ディレクトリのexeプ...
-
ファイルアップロードに関して...
-
$_SERVER["HTTP_HOST"]と、$_SE...
-
makefile でファイルをコピーす...
-
includeが出来ない訳とは?
-
上位ディレクトリ名(フォルダ...
-
rmdirでフォルダが消せません
-
Subversionで、ファイルをリネ...
-
visualstudioでc#のdllができない
-
SHGetSpecialFolderLocation
-
glob関数で日本語文字が取得で...
-
VB.NET 最下位のディレクトリ名...
-
URLに特定の文字を含む場合の条...
-
PHPのプログラムの保存場所
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
バッチを用いたフォルダの自動移動
-
CFileDialogの最初のディレクト...
-
現在位置より2つ上のディレク...
-
Subversionのリポジトリの削除
-
fopenでファイルが開かない場合...
-
makefile でファイルをコピーす...
-
VB.NET 最下位のディレクトリ名...
-
rmdirでフォルダが消せません
-
visualstudioでc#のdllができない
-
ファイルアップロードに関して...
-
絶対パス?絶対アドレス?意味...
-
MkDir関数
-
拡張子を隠すのは良い事なので...
-
Subversionで、ファイルをリネ...
-
powershell で書いたプログラム...
-
コマンドプロンプトを指定のデ...
-
ファイル選択ダイアログで選択...
-
aspのページが表示できません
-
JAVA内で複数のファイルを削除...
おすすめ情報