2017-12-19 5 views
0

ベースディレクトリには約20のサブディレクトリがあります。各サブディレクトリには多数のファイルがあります。私はすべてのファイルを特定のサブディレクトリから、ベースディレクトリの新しく作成されたサブディレクトリに一度に移動する必要があります。私はベースディレクトリD:\Documentsに以下のディレクトリを持っている。例えば特定のサブディレクトリからディレクトリツリーのベースディレクトリにあるサブディレクトリにファイルを移動するにはどうすればよいですか?

D:\Documents\12345\data\images\ 
D:\Documents\12345\test\ 
D:\Documents\12345\documents\ 

私はベースディレクトリ内のディレクトリD:\Documents\imagesを作成するために、新たにimages下のすべてのファイルを移動する必要があります。

これで私を助けてもらえますか?

+1

あなたが何かを自分で試したことを助けること。しかし、あなたがしているように思われるのは、無料でいくつかのコードを要求することだけです。 [ツアー]を読んでここで尋ねてください! – aschipfl

+0

明確にするために、(1)あなたの例のように正確に1つのディレクトリから別のディレクトリにすべてのファイルを移動する必要がありますか、(2)複数のサブディレクトリからすべてのファイルを移動する必要がありますか。 (2)の場合、移動する必要がある特定のサブディレクトリの名前または内容にパターンがありますか? – Tzalumen

答えて

0

この小さなバッチファイルには、ジョブを作成:

@echo off 
md D:\Documents\images 2>nul 
for /F "delims=" %%I in ('dir D:\Documents\* /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /R /C:D:\\Documents\\..*\\images\\ 2^>nul') do (
    move /Y "%%I" "D:\Documents\images\%%~nxI" 
    rd "%%~dpI" 2>nul 
) 

バッチファイルが最初にこのディレクトリがすでに存在する場合MDによりエラーメッセージ出力を抑制することで、ターゲットディレクトリを作成します。このバッチファイルでは、このディレクトリを作成して、このディレクトリに追加のチェックを行わずにファイルを移動することができます。理由のため/S

コマンドDIRD:\Documents内を検索し、すべてのそれのサブディレクトリだけでファイルの拡張子とし、この中にファイル名だけを意味しているので、/Bのため/A-D(属性いないディレクトリ)のファイルと裸の形式にして出力しますまた、/Sのために完全なパスを持つケース。

DIRは、D:\Documentsディレクトリツリー内にファイルが見つかりませんでした。この場合、STDERRを処理するエラーメッセージは、NUL2>nulを使用して、DIRの後にリダイレクトすることによって抑制されます。

DIRによってこの出力は、フィルタとして使用コマンドFINDSTRの入力としてリダイレクトされます。正規表現を実行して、\images\が見つかる前に、少なくとも1文字以上の文字を含むD:\Documents\で始まる行を検索します。したがって、ディレクトリD:\Documents\images\のファイルは、このディレクトリの場合は、バッチファイルの開始時にファイルとともにすでに存在しています。しかし、この正規表現は、パスの最後に\images\が見つかるかどうかをチェックしないので、例えばD:\Documents\12345\data\images\Subfolder\のファイルをフィルタリングしません。

FINDSTRは、正規表現に一致する行(ファイル名)が見つかりませんでした。この場合のエラーメッセージ出力は、FINDSTRの後に2>nulを使用して抑制されます。

DIRFINDSTRとコマンドラインが別のコマンド処理で FOR によって実行される、可視ウィンドウなしで、バックグラウンドでcmd.exe /Cで開始しました。リダイレクション演算子は>| FOR の実行前にコマンドラインの全体を解析する上で、Windowsのコマンド・インタプリタによってリテラル文字として最初に解釈する^でエスケープする必要があります。そのため。

別のコマンド処理でSTDOUTを処理するDIRFINDSTRでコマンドラインによるライン出力は FOR によって捕捉され、次いで行ずつ処理されます。 delims=では、空白の区切り文字リストを指定することによって、各行を区切り記号としてスペースと水平タブを使用してトークンに分割するデフォルトの動作が無効になります。

コマンドMOVEは、見つかったファイルをD:\Documents\images\に移動し、そのディレクトリに同じ名前のファイルを上書きします。

コマンドRDは、ファイルを移動した後にこのディレクトリが空の場合、移動したファイルのディレクトリを削除します。それ以外の場合は、まだ空でないディレクトリにエラーメッセージがRDSTDERRを処理するために出力され、もう一度2>nulを使用して抑制されます。

使用されているコマンドとその動作方法を理解するには、コマンドプロンプトウィンドウを開き、次のコマンドを実行して、コマンドごとに表示されているすべてのヘルプページをすべてよく読んでください。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • md /?
  • move /?
  • rd /?

Using Command Redirection Operatorsに関するMicrosoftの記事も参照してください。

関連する問題