web-dev-qa-db-ja.com

ROBOCOPY-フォルダのコンテンツを単一のフォルダにコピーします

これが私が作ったコードです:)

@echo off
set source="R:\Contracts\"
set destination="R:\Contracts\Sites\"
ROBOCOPY %source% %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 /S
for /r %source in (*) do @copy "%destination" .

R:\ Contracts \は、ファイルを含むフォルダーでいっぱいです。

すべてをR:\ Contracts\Sites \にコピーして、フォルダー構造をフラットにします。

すべてがうまくコピーされますが、フォルダ構造もコピーされます。

ありがとうございました

9
Arthor

単一のコマンドで階層が平坦化されることはありません。複数のコマンドを使用する必要があります。これは、FOR/Rを使用して階層をウォークし、選択したcopy/moveコマンド(move、copy、xcopy、robocopy)と組み合わせて簡単に実行できます。宛先はソース階層内にあるため、宛先がソースにならないようにIFが必要です。

先に進む前に、停止して、同じファイル名が複数のソースフォルダに表示された場合にどうなるかを考える必要があります。宛先フォルダーには1つのバージョンしか含めることができません。重複する名前が存在しないことを保証できますか?そうでない場合、どのファイルを保持する必要がありますか?必要なファイルを保持するようにコマンドをどのように構成できますか?この複雑さは、おそらく、階層を単純にフラット化するコマンドが作成されなかった理由です。

これは、FOR/Rソリューションと統合されたROBOCOPYコマンドです。

@echo off
set source="R:\Contracts"
set destination="R:\Contracts\Sites"

::Not sure if this is needed
::It guarantees you have a canonical path (standard form)
for %%F in (%destination%) do set destination="%%~fF"

for /r %source% %%F in (.) do if "%%~fF" neq %destination% ROBOCOPY "%%F" %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0
9
dbenham

PowerShellの1つのライナーを使用してこれを行うことができます。この例では、拡張子が.txtのすべてのファイルをすべてのサブフォルダーからフィルターで除外します。次に、それらをMove-Itemコマンドレットに送信します。

コマンドレットget-Childitem(略してGCI)、-recurse、maby -filterを組み合わせて、結果をMove-Itemコマンドレットにパイプします。最初に-WhatIfを使用して、出力が期待どおりであることを確認します。

現在のフォルダに移動します

get-Childitem -recurse -filter *.txt | Move-Item -WhatIf

別のフォルダに移動する

get-Childitem -recurse -filter *.txt | Move-Item -Destination c:\temp -WhatIf
11
Gargamel

以前のPowershellオプションと同様に、マルチサブディレクトリの音楽フォルダーをフラット化するために次のことを行いました。

#Get all files and not the directories
$files = Get-ChildItem -Path R:\Contracts -Recurse | Where {$_.PSIsContainer -eq $false}

#Copy items from sources to new destination
foreach ($file in $files){
    Copy-Item -Path $file.FullName -Destination R:\Contracts\Sites\$($file.Name)
}

Get-ChildItem with -Recurseスイッチは、すべてのサブフォルダーとファイルのリストを取得します。 Where関数は、ブール値PSIsContainerプロパティをチェックすることにより、ディレクトリを削除しています。ディレクトリを削除しないと、サブフォルダ構造はファイルなしで作成されます。このリストは$ files変数に格納されます。

foreach関数は、$ files変数内のファイルのリストを実行し、$ file変数に一度に1つの項目を格納します。 Copy-Item関数は、$ file.FullNameからのフルパスを使用して、ファイルを$ file.Name)から同じ名前の宛先にコピーします。

1
Surya

現在のサブディレクトリで同じコマンドを操作できるSweep.exeと呼ばれる古いPCMagユーティリティがあります。宛先をソースディレクトリのサブディレクトリとして配置しません。目的地を別の場所に置きます。

http://www.rarewares.org/files/case/Sweep.Zip

cd c:\contracts sweep copy *.* c:\sites

これにより、c:\ Contractsおよびその下からc:\ sitesにすべてがコピーされます。

同様のコマンドを使用して、ディレクトリの階層をフラット化します。

重複とその処理方法に注意してください。別の方法で上書きまたは処理しますか?.

0
Sun

最近、この問題に取り組む必要があり、階層から単一のフォルダーに移動したい多くのファイルは互いに同じ名前であり、上書きされることなく階層をフラット化したいと考えていました。私がしたことは、ファイルを移動するスクリプトを作成することでしたが、古い階層パスに名前を変更しました名前で例:ソースファイル:

C:\ files\somefiles\file.txt

C:\ files\otherfiles\file.txt

宛先はC:\ newdir \ファイルは次のように作成されます

C:\ newdir\somefiles-file.txt

C:\ newdir\otherfiles-file.txt

コードは次のとおりです。バッチファイル1はファイルを通過し、バッチファイル2は名前を変更してファイルを移動します(ソースを保持したい場合は、代わりにコピーすることもできます。

@echo off
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf"

renameandmovefilespart2.bat

@echo off
Setlocal EnableDelayedExpansion
rem set the whole file path
set origWhole=%1
set origPathOnly=%2
set extension=%3
rem here you can set where the directory to hold the flattened hierarchy is
set destDir=c:\destinationDir\
rem  set the directory to do a string replace
rem make this the starting directory, that you dont want in the newly renamed files
set startingDir=C:\starting\directory\
set nothing=
set slash=\
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=--
set quote="
rem cut out the starting part of the directory
call set newname=%%origWhole:!startingDir!=!nothing!%%
rem replace slashes with new character
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%%
rem remove quotes
call set newname=%%newname:!quote!=!nothing!%%
rem @echo shortened: %newname%
rem @echo source path: %origPathOnly% newPath: %startingDir%
rem @echo extension: %extension%
rem rename the files
ren %origWhole% %newname%
rem prepare to move the file, clean up the source path
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%%
move "%origPathOnly%%newname%" "%destDir%"
0
Max