• ベストアンサー

コマンドでのファイルの移動

aaフォルダの中に複数のフォルダがあり、その複数フォルダの中のファイルをすべてbbフォルダに移したいのですが・・・・ for /f %a in ('dir D:\aa /b') do xcopy /d D:\aa\%a\* D:\bb\ とすると、aaの中のフォルダで、フォルダ名が半角スペースを含むものは移動の対象となってくれません。(>_<) 「てす と」フォルダは「てす」として判断され、中のファイルは そのまま残ってしまいます。 どのようにすればうまくいけるのでしょうか。 よろしくお願いいたします。

  • ton77
  • お礼率12% (10/78)

質問者が選んだベストアンサー

  • ベストアンサー
  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.3

for /f %a in ('dir D:\aa /b') では、「%a」に入るものが、フォルダ名の先頭から最初のスペースまでになってしまうようですね。 for /d %a in (D:\aa\*.*) do xcopy /d "%a"\*.* d:\bb で、「%a」に「D:\aa\」以下のサブフォルダ名が順次入ります。 「%a」に入るパス名は、「D:\aa\」から始まるフルパス名で、半角スペースが含まれていても二重引用符では括られていませんから、xcopyコマンドのパラメータに指定する際に、「%a」を二重引用符で括ります。

ton77
質問者

お礼

有難うございます!!希望通りになりました!感激です。 見ず知らずなのに丁寧に教えて頂き本当にありがとうございました。 また何かありましたらよろしくお願いします!!

その他の回答 (7)

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.8

To:No.#7 お節介かもしれませんが、コマンドラインの解説が必要なようですね。 for /f %a in ('dir D:\aa /b') do xcopy /d D:\aa\%a\* D:\bb\ 質問者の方が↑のコマンドラインで意図しているのは、"D:\aa"フォルダ下のサブフォルダ内にあるファイルの中で、"D:\bb"フォルダにある同名ファイルよりも『更新日時の新しいファイルだけ』を、『フォルダ構造はコピーせず』に、上書きコピーするというものです。("D:\bb"フォルダに存在しないファイルもコピーされます。) そのようなわけで、リネームでは対応出来ませんし、エクスプローラからの単純なコピーでも出来ません。 ANo.#6の方の回答通知メールが届きませんから、多分、冒頭の部分が問題視されて、審査対象になっているんだろうと思いますョ。禁止事項ですから。この回答も削除対象かも・・・。 ■指摘回答 その内容に間違いや錯誤があると思われることなどについてことさらに指摘したり、批評・批判する回答は、削除・編集の対象とさせていただきます。 http://help.okwave.jp/okwave/beginner/prohibition.html

  • kiwa67
  • ベストアンサー率22% (82/357)
回答No.7

#4 です。 ちょっと疑問に思いまして、 >回答No.4、No.5は無視しましょう。どちらも、ご質問の文中に >あるDOSコマンドの意味を理解していない回答なので。 ここのスレッドは、for do にこだわったスレですか? もともとの要求が  > aaフォルダの中に複数のフォルダがあり、その複数フォルダの中の  > ファイルをすべてbbフォルダに移したいのですが・・・・ だったので、別案での解決方法もありかと思いました。

  • rioworks
  • ベストアンサー率41% (19/46)
回答No.6

回答No.4、No.5は無視しましょう。どちらも、ご質問の文中にあるDOSコマンドの意味を理解していない回答なので。 for /? で、ヘルプを表示すると、長ったらしい説明の中に、 >空白で区切られた最初のトークンを渡します。空白行はスキップされます。 >既定の解析動作を変更するには、オプションの "オプション" パラメータを指定します。 とあるように、 for /f %a in ('dir D:\aa /b') では、 dir D:\aa /b の出力の各行の先頭から最初の空白までしか%aに入りませんので、"delims=区切り文字"オプションを使って、空白を区切り文字として認識しないように指定する必要があります。(空白を無視するには、"delims="と区切り文字を何も指定しない形式を使います。) for /f "delims=" %a in ('dir D:\aa /b') do xcopy /d D:\aa\"%a"\* D:\bb\ (xcopyコマンドの%aは二重引用符で括ってください。) 上のコマンドでも、D:\aaフォルダ内にサブフォルダしかなければ問題はありませんが、サブフォルダとファイルが混在していると、その後のxcopyコマンドがエラーになってしまいます(%aにファイル名が入いると、ファイル名\*を指定することになるので)ので、dirコマンドで/a:dオプションを指定して、フォルダ名だけを出力するようにした方が良いと思います。 for /f "delims=" %a in ('dir D:\aa /a:d /b') do xcopy /d D:\aa\"%a"\* D:\bb\ 回答No.3の for /d %a in (D:\aa\*.*) do xcopy /d "%a"\*.* d:\bb の方が簡単だと思ったりしますが、forコマンドの/fオプションの使い方ということで、ご参考になれば。

ton77
質問者

お礼

有難うございます! 教えて頂いたコマンドでばっちりです!! より詳しく教えて頂き勉強になりました。 本当にありがとうございました。

  • SEWANIN
  • ベストアンサー率34% (203/592)
回答No.5

  ton77 様  敢えてDOSコマンドをお使いにならなくても  「aaフォルダ」下の「複数のフォルダ」にある  ファイルを全て選択なさいました上、切り取って  「bbフォルダ」に貼り付けられればご希望の  ようにお出来になると思います。  お試し済みのことでしたらご容赦願います。

  • kiwa67
  • ベストアンサー率22% (82/357)
回答No.4

bb が存在しないフォルダなら   rename aa bb で、できますが。。。。。

  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.2

パラメータを使うとややこしくなるので, 単純にxcopyのサブディレクト以下をコピーするオプションを使って xcopy D:\aa\* D:\bb\ /E /S で一発でできると思いますが・・

ton77
質問者

補足

有難うございます。そのままやってしまうとbbの中にフォルダごと移ってしまいます・・・。aaの中の複数フォルダの中身のファイルだけを bbに移したいです。 よろしくお願いいたします

  • deadline
  • ベストアンサー率63% (1239/1943)
回答No.1

for /f %a in ('dir D:\aa /b') do xcopy /d D:\aa\"%a"\* D:\bb\ xcopyのパラメータの「%a」を二重引用符で括ってください。

ton77
質問者

補足

有難うございます。それも試してみたのですが、なぜかダメなんです。 具体的に言うとaaフォルダの中に「The Beatles」というフォルダが あり、その中に「Something.m4a」という曲ファイルがあるのですが、 実行すると D:\>xcopy /d D:\aa\"The"\* D:\bb\ ファイルが見つかりません - * 0 個のファイルをコピーしました となり、”The”だけになってしまいます・・・。 よろしくお願いいたします。

関連するQ&A

  • バッチファイル 文字列にスペースがある場合

    for /f %%A in ('dir /b /s c:\a aa*.pdf') do copy "%%A" D:\ これはcドライブのa aaというフォルダ名の中を検索するコードですが、 フォルダ名にスペースがあるため、うまく動きません。 "a aa"のように""で囲ってみましたが、駄目でした。 どうすれば良いのか、教えていただきたいので、お願いします。

  • コマンドプロンプト 半角スペースを含んだ文字列の抽出

    コマンドプロンプト 半角スペースを含んだ文字列の抽出 したいです。 reg quaryの結果の一部をコマンドプロンプトで抽出したいのですが、半角スペースを含んでいるからか、求めるような結果が得られません。 ●ほしい文字列: C:\Program Files\aaa bbb ccc\aa bb ●reg quaryの結果: ! REG.EXE VERSION 3.0 HKEY_LOCAL_MACHINE\SOFTWARE\aaaRegister Dir REG_SZ C:\Program Files\aaa bbb ccc\aa bb ●試したコマンド: for /f "skip=2 tokens=\3,*" %A in ('reg query %REGNAME% /v Dir') do echo %A ●結果:C:\Program どのようなコマンドが適当なのでしょうか?宜しくお願いいたします。

  • Windows環境にてforコマンドで空白を含むファイルを検索して、検

    Windows環境にてforコマンドで空白を含むファイルを検索して、検索結果を移動させるバッチを作成したいのですが検索結果に空白を含む場合、移動することができないので困っています。 例えば以下のような状況で実行した場合はどうすればうまく移動することができるのでしょうか? コマンド-------------------- for /f %%A in ('dir /b /s *.mp3') do move "%%A" d:/test カレントディレクトリ------------ AA.txt BB.txt C C.txt 実行結果 AA.txt-->移動 BB.txt-->移動 move "C" d:/test-->指定されたファイルが見つかりません。 おそらくdirコマンドでの検索されたファイルに空白が入っているときは%%Aに空白までのファイル名が挿入されていることが原因だと思います。 コマンドで検索されたファイルを""で括るようなことができれば解決できると思っていますが、そのようなことができるのか知っている方がおりましたら教えていただけないでしょうか? よろしくお願いいたします。 以上

  • フォルダ内の更新日時が一番新しいファイルを開きたい

    バッチファイルを作成してるんですが cd /d 指定フォルダ for /f %%i in ('dir /b /od') do set x="%%~fi" start "" %x% これだとファイル名にスペースがあるとうまく動いてくれません。 どう書き換えれば動くのでしょうか?

  • シェルスクリプトでのファイル操作

    Linuxをつかいシェルスクリプトを組んでいます for arg in ${DIR}_/*.csv do md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> ${DIR}/HASH.csv done 上記のような処理でHASH.csvにファイル名とファイルのハッシュ情報を登録しています。 ↓登録されたデータはこんな形になります。  aa/bb/cc/xx.csv,aa339d9idedeeded・・・  aa/bb/cc/ww.csv,aa339d9idedeeded・・・   しかし、このままだとこのパスの部分『aa/bb/cc/』が邪魔なので削除したいと考え 以下のようにしましたが、うまく登録できません。 sed -e "s/\/\(aa\)\/\(bb\)\/\(cc\)\///g" ${DIR}/HASH.csv > ${DIR}/B8HASH.csv >>で出力するようにしたら削除前の下に削除後の情報が追加されてしまいました。 このような場合はどのようにしたら良いのか、ご助言お願い致します。 この方法ではなく、for文の時点で削除できるようであればその方法を教えてください。

  • コマンドプロンプトで別マシンへファイルを移動する

    すいません。 コマンドプロンプトでフォルダ単位でファイルの移動を実施したいのですが、 別のマシンに対してファイルの移動は可能なのでしょうか? 現在、 for /d %M in (mode_*) do move %M C:\move\test\ は可能なのですが、 for /d %M in (mode_*) do move %M Z:\move\test\ で移動ができません。 実行すると、 C:\move>move mode_dir3 Z:\move\test\ アクセスが拒否されました。 と表示されます。 ※Z:\move\test\については、エクスプローラのアドレスバー に直接指定すると移動できるようになっております。 (GUI的に移動も可能な状態です) おわかりになられる方がおりましたら、 ご回答のほど、よろしくお願い致します。

  • DOSのコピーコマンド

    このカテゴリーで良いかどうかわかりませんが、教えてください。(説明が下手ですみませんが) Cドライブのあるフォルダーの中のファイル(1つまたは複数)をDドライブにコピーするバッチファイルを作ろうと思います。 たとえばyyyyフォルダーのzzzzをコピーする場合は次のような1文です。 xcopy c:\yyyy\zzzz.* d:\ /e この時、フォルダー名にスペースがあるときはどうしたらいいのかわかりません。 たとえばc:\windows updateのようなフォルダー名の場合 xcopy c:\yyyy xxxx\zzzz.* d:\ /e では動きません(yyyyとxxxxの間にスペースがあるから)。 この場合DOSコマンドをどう書けば良いのか教えてください。

  • バッチファイルにて指定フォルダごとコピーする方法

    バッチファイル初心者の為ご教授をお願いします。 Cドライブ直下に下記のようなフォルダがあります。 (それぞれのフォルダ内には沢山のフォルダやファイルが保存されています) 0001_2016_04_29 0001_2016_06_29 0001_2016_07_14 0002_2016_06_29 0002_2016_07_14 0002_2016_07_25 これをFドライブ(USBHDD)へフォルダ毎コピーしたいと思います。 XCOPYもしくはROBOCOPYでワイルドカードを使用しコピー出来ないでしょうか? Fドライブへは差分で保存し続けたいのでミラーは使用出来ません。 自分なりにしらべて下記のように記述してみたのですがうまくいきませんでした。 for /D %%A in (C:\0001*) do xcopy %%A /e F:\.

  • バッチでmdbを最適化したいのですが、ldbファイルが存在した場合の処

    バッチでmdbを最適化したいのですが、ldbファイルが存在した場合の処理キャンセルが分かりません。 親フォルダ ├子フォルダ1 │├AA.mdb │└BB.mdb ├子フォルダ2 ・・・ 現在は下記を実行しています。 set backdate=%date:~-10,4%%date:~-5,2%%date:~-2,2% set logfile=\\192.168.10.15\d\ACCESSBackup\log\copyall_%backdate%.log date /T >> %logfile% time /T >> %logfile% xcopy "\\192.168.10.14\ACCESS_SYSTEM" "\\192.168.10.15\d\ACCESSBackup\ACCESS_SYSTEM\" /C /D /E /R /Y >> %logfile% for /f %%A in ('dir /b /s C:\ACCESS_SYSTEM\*.mdb') do "C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" %%A /compact 上記で 親フォルダ丸ごとバックアップ ログファイルを出力 親フォルダからmdbを全て検索し最適化 ↑ この最適化の前に%%Aのファイルのldbが存在したら最適化をキャンセルさせたいのですがやり方がわかりません。 %%A→C:\ACCESS_SYSTEM\子フォルダ\AA.mdbだったら C:\ACCESS_SYSTEM\子フォルダ\AA.ldbの存在をチェックし、あれば最適化しない。 mdbが多いので、VBAで個別に組み込まずタスクで夜中にでも一気にバックアップ・最適化したいと考えています。 どなたか知恵をお貸し下さい。 宜しくお願いいたします。

  • 特定のフォルダを除外してバックアップするバッチファイル

    現在、複数のネットワーク共有のバックアップを採るバッチファイル(下記)を使用しております。 以下の書き方ですと、全てのフォルダが採られてしまいます。 特定のフォルダだけ除いてバックアップを取るバッチファイルを作成したいのですが、どのようにすれば宜しいでしょうか? ○サーバ(saruru)の全ての共有フォルダを、自分のPCの「J:\saruru\」以下にバックアップする。 for /f "tokens=1,2" %%A in ('net view \\saruru') do if %%B==Disk xcopy /y /s /i /d \\saruru\%%A J:\saruru\%%A\ >> err.txt rem for /f "tokens=1,2" %%A in ('net view \\saruru') do if %%B==Disk xcopy /c /h /y /k /f /s /i /d \\saruru\%%A I:\saruru\%%A\ >> err.txt もっとベストなスクリプトがありましたら、ご教授お願いいたします。