Windows コマンドライン: 指定されたルート ディレクトリの下のファイルではなくサブディレクトリをコピーするにはどうすればよいですか?

Windows コマンドライン: 指定されたルート ディレクトリの下のファイルではなくサブディレクトリをコピーするにはどうすればよいですか?

ファイル階層は次のようになります:

RootDir
  /A
    /fileA.txt
  /B
    /C
       /fileC.txt
    /fileB.txt
  /otherFile1.txt
  /otherFile2.txt

Aサブディレクトリ(つまり、、B)のみをコピーしたいのですが、彼らの下にあるすべてのものotherFile1.txt(つまり、と を除くすべてをコピーしますotherFile2.txt)。

ルート ディレクトリの下には 2 つのディレクトリと 2 つのファイルよりも多くのディレクトリとファイルが存在するため、それぞれを名前で指定することは避けます。

助言がありますか?

答え1

組み合わせて使用​​できます/fの場合xコピーそしてディレクトリこのタスクを達成するには:

cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"

使い方:

  • 一度入力するとソースディレクトリの場合、コマンドはdir /B /ADすべてのディレクトリ ( /AD) を 1 行ずつ一覧表示します ( /B)。

  • for /F "delims=" %a in ('...') doコマンドの出力を調べ...、変数を%a出力の次の行に設定し、それに続くものを実行しますdo

    ここでは、delims=変数が行全体の内容を保持していることを確認します。これがないと、%a最初のスペースまでの文字のみが保持されます。

  • xcopy /E "%a" "DESTINATION\%a\"現在指定されているディレクトリを%aディレクトリ内の同じ名前のフォルダにコピーします行き先スイッチにより、/Eディレクトリの内容もコピーされます。1

    コピー先にディレクトリ名を指定することは必須です。指定しないと、ではなく がfileA.txtにコピーされます。DESTINATION\fileA.txtDESTINATION\A\fileA.txt

    末尾のバックスラッシュは、それが%aファイルではなくディレクトリの名前であることを示すために使用されます。スペースを含むディレクトリ名を適切に処理するには、二重引用符が必要です。

このコマンドをバッチ ファイル内で使用する場合は、すべてのパーセント記号を 2 番目のパーセント記号でエスケープする必要があります。つまり、%aになります。%%a


1 は /E空のディレクトリもコピーします。これが望ましくない場合は、/S代わりに を使用できます。

答え2

Dennis と David Ruhmann の回答と似ていますが、FOR /F の代わりに FOR /D ループを使用します。

for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"

答え3

私が考えられる最良の方法は、フォルダー構造全体と「長さ0のファイルのみ」のみをコピーするRobocopyの「/create」スイッチを使用することです。これにより、すべてのファイルが除外されることは間違いありません。

Robocopy /e /create \(フォルダAのソースパス) \(宛先パス)

Robocopy /e /create \(フォルダBのソースパス) \(宛先パス)

また、(ファイルの種類がすべて同じ場合、または既知のファイルの種類が少ない場合は)「除外ファイル」の「/xf」スイッチを使用して、次のようにファイルの種類をワイルドカードで除外することもできます。

Robocopy /e (フォルダAのソースパス) (宛先パス) /xf *.txt

Robocopy /e (フォルダBのソースパス) (宛先パス) /xf *.txt

答え4

ネイティブ Windows CMD ソリューション。RootDir からサブフォルダー (およびその内容) のみをコピーします。

for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i

関連情報