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 \ и сгладить структуру папок.

Все копируется хорошо, но также и структура папок.

Спасибо


person Arthor    schedule 31.12.2011    source источник
comment
возможный дубликат Как скопировать файлы из дерева папок, удалив все папки с помощью Robocopy?   -  person Ken White    schedule 31.12.2011


Ответы (5)


Никакая отдельная команда не сгладит иерархию за вас; вам придется использовать несколько команд. Это можно сделать, просто используя FOR / R для обхода иерархии в сочетании с выбранной вами командой копирования / перемещения (перемещение, копирование, xcopy, robocopy). Поскольку ваш пункт назначения находится в исходной иерархии, вам понадобится IF, чтобы предотвратить его использование в качестве источника.

Прежде чем продолжить, вам следует остановиться и подумать, что произойдет, если одно и то же имя файла появится в нескольких исходных папках. В папке назначения может быть только одна версия. Можете ли вы гарантировать отсутствие повторяющихся имен? Если нет, то какой файл следует сохранить? Как вы можете структурировать команду, чтобы сохранить нужный файл? Вероятно, из-за этого усложнения не было написано ни одной команды для простого выравнивания иерархии.

Вот ваша команда ROBOCOPY, интегрированная с решением FOR / R.

@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
person dbenham    schedule 31.12.2011
comment
Привет, dbenham, прежде всего, БОЛЬШОЕ спасибо. Я пробовал приведенный выше код, но, похоже, он не работает. Я сделал командный файл и протестировал его. Я ввел код и не вижу прямой ошибки. Пожалуйста, дай мне знать. Спасибо - person Arthor; 02.01.2012
comment
Здравствуйте, я удалил эту строку для %% F в (% destination%), установите destination =% ~ fF, и, похоже, он работает. Однако я не уверен, нужно ли это. Если спасибо Спасибо DBENHAM - person Arthor; 02.01.2012
comment
К сожалению, в конце этой строки мне не хватало одного процента. Теперь это исправлено. Его цель состояла в том, чтобы убедиться, что путь был представлен в полностью квалифицированной стандартной форме, чтобы последующий оператор IF работал правильно. - person dbenham; 02.01.2012
comment
Здравствуйте, у меня есть вопрос. Когда я устанавливаю источник и место назначения с коротким именем файла, все работает, однако, если я использую длинное имя файла, например. c: \ files \ contract open \ site \ usa \ content clean \ over load \ psjj200, похоже, не работает. Любая помощь, пожалуйста - person Arthor; 03.01.2012
comment
@Arthor - Я забыл заключить цитаты вокруг источника ROBOCOPY (%% F). Редактирование завершено. - person dbenham; 03.01.2012
comment
Итак, как это обрабатывает повторяющиеся имена файлов? Какой файл хранится? - person ; 12.07.2017
comment
@ColeTrumbo - Дубликаты не обрабатываются должным образом. Это решение следует использовать только в том случае, если вы уверены, что нет повторяющихся имен файлов. Если вы запустите вышеуказанное с дубликатами, то побеждает последний скопированный. - person dbenham; 12.07.2017

Вы можете сделать это с помощью однострочника PowerShell. В этом примере я отфильтровываю все файлы с расширением .txt из всех подпапок. А затем отправьте их в командлет Copy-Item.

Объедините командлеты Get-Childitem (сокращенно GCI), -recurse и -filter, а затем передайте результат командлету Copy-Item. Сначала используйте -WhatIf, чтобы убедиться, что результат соответствует вашим ожиданиям.

Копировать в другую папку (используйте -WhatIf и проверьте вывод, чтобы проверить свою команду перед тем, как приступить к копированию файлов):

Get-Childitem -recurse R:\Contracts -filter *.txt | Copy-Item -Destination R:\Contracts\Sites -WhatIf

Чтобы задать несколько типов файлов, как вы просили, вы можете просто запустить несколько команд, по одной для каждого типа файла.

person Gargamel    schedule 12.02.2015
comment
блестящий. просто, понятно. - person sonjz; 26.05.2016
comment
проголосовано против, потому что Move-Item следует изменить на Copy-Item. Поменяй, и я проголосую за - person Stefan Karlsson; 22.10.2019
comment
Отредактировано для использования Copy-Item и источника / назначения из исходного сообщения. - person Casey Kuball; 16.07.2020

Подобно предыдущему варианту 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 с переключателем -Recurse позволяет получить список всех подпапок и файлов. Функция Where удаляет все каталоги, проверяя логическое свойство PSIsContainer. Без удаления каталогов структура подпапок будет создана без файлов в них. Этот список хранится в переменной $ files.

Функция foreach просматривает список файлов в переменной $ files и сохраняет по одному элементу в переменной $ file. Затем функция Copy-Item использует полный путь из $ file.FullName, а затем копирует файл в место назначения с тем же именем из $ file.Name < / сильный>.

person Surya    schedule 14.09.2019

Недавно мне пришлось решать эту проблему, и многие файлы, которые я хотел переместить из иерархии в одну папку, имели то же имя, что и друг друга, и я все же хотел сгладить иерархию, чтобы они не перезаписывались. Я написал сценарий, который перемещает файл, но переименовывает его, используя старый путь иерархии в имени, например: исходные файлы:

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%"
person Max    schedule 12.09.2014

Есть старая утилита PCMag под названием Sweep.exe, которая может выполнять одну и ту же команду в текущем каталоге и в подкаталоге. Я бы не стал помещать место назначения как подкаталог исходного каталога. Поместите пункт назначения в другое место.

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

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

Это скопирует все из c: \ контрактов и ниже на c: \ sites

Я использую аналогичную команду для выравнивания иерархии каталога.

Позаботьтесь о дубликатах и ​​о том, как вы хотите с ними обращаться. Вы хотите перезаписать или обработать по-другому.

person Sun    schedule 22.08.2015