2015-08-20 2 views
1

Я хочу скопировать все файлы только в подпапки второго уровня в другое место. Все имена файлов уникальны. Подпапки второго уровня в этом примере 01102009, 05302009 и 09012010. Пример:Скопируйте файлы из подпапки первого уровня только в другое место

C:\test\ 
    2009\ 
    01102009\ 
     file123.A09 
     file567.B07 
    05302009\ 
     fileabc.A09 
     filexyz.A09 
     ThirdLevelSubFolder\ 
      fileBLAH.B10 
    2010\ 
    09012010\ 
     fileHello.A08 
     fileBye.B10 
    etc. 

Если вернуться:

C:\final\ 
    file123.A09 
    file567.B07 
    fileabc.A09 
    filexyz.A09 
    fileHello.A08 
    fileBye.B10 

Обратите внимание, что не копируют fileBLAH.B10, который был в подпапках третьего уровня.

Если это помогает, все файлы заканчиваются на .A ## или .B ##, где ## - двузначное число.

Я попытался это:

robocopy "C:\test" "C:\final" s /LEV:2 

но копирует папки второго уровня (например, 01102009) и файлы внутри них. Я просто хочу файлы.

Я также попытался:

for /r "C:\test" %i in (*.*) do copy "%~fi" "C:\final" 

но что копии файлов во всех вложенных папках, включая те, третьего уровня, в то время как я хочу только файлы второго уровня вложенных папок.

+0

Larry, вы использовали термины 'первый уровень' и' второй уровень' в заголовке и описании вопроса, где это фактически папка третьего уровня. C: \ test \ 2009 \ 01102009 \ – foxidrive

+0

Существует папка третьего уровня называемый '' ThirdLevelSubFolder'' под папкой второго уровня '05302009'. Но я думаю, если я считаю «тест» папкой 1-го уровня, то у меня на самом деле есть четыре уровня »(например, C: \ test \ 2009 \ 05302009 \ ThirdLevelSubFolder). – Larry

ответ

1

Заключительный править в соответствии с Комментарий foxidrive. Вам нужно два вложенных цикла для лечения файлов на втором уровне вложенной (хотя aschipfl «ы решение с for /D may be a bit more concise):

for /F "delims=" %I in ('dir /B /A:D "C:\test\*.*"') do @for /F "delims=" %i in ('dir /B /A:D "C:\test\%~I\*.*"') do @echo copy /B "C:\test\%~I\%~i\*.*" "C:\final\*.*" 2>NUL 

Оригинальный ответ:

for /r = Loop through files (Recurse subfolders); попробуйте (не рекурсивно) dir /B в FOR /F = Loop command: against the results of another command следующим образом :.

for /F "delims=" %i in ('dir /B /A:D "C:\test\*.*"') do copy /B "C:\test\%~i\*.*" "C:\final\*.*" 2>NUL 

Обратите внимание, что 2>NUL предотвращает отображение в The system cannot find the file specified сообщения, если исходная папка пуста.

Выхода (с изменено C:\ к D:\): Первый dir /B показывает, что мы начинаем с целевой папкой пустыми, в то время как последний dir /B показывает, что цель была заселена скопированными файлами ...

d:\bat>dir /B "d:\final\*.*" 

d:\bat>for /F "delims=" %i in ('dir /B /A:D "d:\test\*.*"') do @copy /B /Y "d:\test\%~i\*.*" "d:\final\*.*" 2>NUL 
d:\test\31441809\ttt.txt 
     1 file(s) copied. 
d:\test\ProcMon\LogfileAcrord32Start.CSV 
d:\test\ProcMon\LogfileIE.CSV 
d:\test\ProcMon\LogfileIEStart.CSV 
d:\test\ProcMon\LogfileSwriter.CSV 
d:\test\ProcMon\LogfileSwriterStart.CSV 
     5 file(s) copied. 
d:\test\ScreenCaptures\*.* 
     0 file(s) copied. 
d:\test\set\HKCU.txt 
d:\test\set\hklm.txt 
d:\test\set\regs.txt 
d:\test\set\set.txt 
d:\test\set\t!exclam!t.txt 
     5 file(s) copied. 

d:\bat>dir /B "d:\final\*.*" 
HKCU.txt 
hklm.txt 
LogfileAcrord32Start.CSV 
LogfileIE.CSV 
LogfileIEStart.CSV 
LogfileSwriter.CSV 
LogfileSwriterStart.CSV 
regs.txt 
set.txt 
t!exclam!t.txt 
ttt.txt 

d:\bat> 
+0

Когда я ввел вашу команду в приглашении cmd, все как одну строку и нажмите enter, он сгенерировал шесть строк вывода (по одному для каждой подпапки 1-го уровня в C: \ test (например, 2009, 2010 ... и т. Д.), но для каждой строки он сказал '0 файл (ы) скопирован'. – Larry

+0

@Larry Код работает отлично здесь - у вас есть правильные пути и файлы в нужных местах? – foxidrive

+1

@Larry Я вижу вашу проблему - вы попросили 2-го уровня файлы, но вы действительно имеете в виду файлы третьего уровня. 'c: \ test' - первый уровень. – foxidrive

1

хитрость состоит из двух вложенных for /D петли, каждая из которых охватывает определенный уровень иерархии каталогов:

@echo off 
for /D %%A in ("C:\test\*") do (
    for /D %%B in ("%%~fA\*") do (
    xcopy /L /I "%%~fB\*.*" "C:\final" 
) 
) 

Этот код действительно ничего не копирует, он просто перечисляет то, что будет скопировано; чтобы разрешить копирование, удалите переключатель /L с xcopy.

Сценарий не фильтрует по шаблонам *.A?? и *.B??; если вы хотите это сделать, вам понадобятся две команды xcopy.
Кроме того, он не копирует ничего с первого уровня каталога, так как ваш список примеров не показывает никаких файлов.


Поправка:
Когда я говорю об уровне каталогов, советуюсь следующее определение:
Все уровни пронумерованы относительно корневой каталог C:\test\, так 2009\ это первый уровень, 01102009\ является 2-й и т. д.

+0

Это также сработало. Принял некоторые исследования, чтобы выяснить, как их реализовать (я использовал cmd подскажите, может быть, однажды в моей жизни). Сначала я попытался ввести все как одну строку и получил «%% A был неожиданным в это время». Поиск в Google предполагал, что он предназначен для запуска в виде пакетной программы. Если посмотреть, тоже. Итак, для новичков, способ запускать код aschipfl: 1) скопировать hi s в блокнот, 2) сохраните файл с расширением .bat (например, «copyfiles.bat») в любом месте, 3) дважды щелкните файл, и он выполнит код. – Larry

+0

Вы можете ввести его как одну строку в командную строку (вы можете опустить часть '@echo off'), но вам нужно заменить все' %% 'на'% '(это также задокументировано в тексте справки' for' command - введите 'for /?' в командной строке ...). – aschipfl

Смежные вопросы