Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
wmzkot
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 3
1

Копирование каждого файла из папки в отдельную папку

21.04.2014, 13:57. Просмотров 2368. Ответов 6
Метки нет (Все метки)

Для выполнения некоторых задач на работе необходимо скопировать из папки, допустим, Camera_1 *.jpeg файлы каждый в отдельную папку, а затем из другой папки (Camera_2) в уже созданные при первом копировании папки. То есть на входе имеем две папки, например, по 100 *.jpeg файлов в каждой, а на выходе - 100 папок по два файла в каждой (один файл из папки №1 и еще один из папки №2).

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

C#
1
2
3
4
   for /r Camera1 %%i in (*.jpeg) do (
      md %%i
      copy %%i %%i
   )
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 13:57
Ответы с готовыми решениями:

Копирование в текущую папку определённого файла из определённой папки
Здравствуйте. Прошу помоши т.к. далек от кодов. Нужно из определенной папки...

Распаковка каждого архива в отдельную папку
столкнулась с проблемой когда необходимо командой из bat-файла извлечь каждый...

Копирование TXT-файлов из одной папки и BMP-файлов из другой папки в папку, в которой находится пакетный файл
Доброго времени суток. У кого есть возможность сообразить какой код мне...

Копирование файлов с папки в папку и запись в txt
Добрый вечер, помогите сделать батник чтоб: - С папки HP копировались все...

Создать для каждого файла папку его имени и перенести в свою папку под именем index.html
Помогите товарищи В папке файлы без расширений нужно создать для каждого файла...

6
Dragokas
Эксперт WindowsАвтор FAQ
17007 / 7063 / 856
Регистрация: 25.12.2011
Сообщений: 10,881
Записей в блоге: 16
22.04.2014, 00:44 2
В каком порядке происходит этап 2) ?
Т.е. по какому принципу раскидываются файлы из папки № 2 в уже созданные каталоги? Или по одному файлу в каждую без разницы какой куда?

Добавлено через 1 минуту
По какому принципу именовать создаваемые папки?
0
wmzkot
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 3
22.04.2014, 01:37  [ТС] 3
Идеально было бы по порядку. Т.е. cam1_0001.jpg в папку к cam2_0001.jpg. Если циклом обрабатывать, то, по сути, так и должно происходить. Файлы в директории-то счетчиком по порядку будут обрабатываться. Файлы в папках с именем cam*_000*.jpg, т.е.файлы пронумерованы в каждой исходной папке от 1 до *, только в каждой папке префикс имени файла разный (cam1_ и cam2_, например).

Как можно совместить счетчик и md? Чтобы создавать папки с цифровым значением типа 0001, 0002 и так далее. Но через переменную, чтобы затем с помощью move и for разложить файлы по папкам в таком же порядке.

Добавлено через 9 минут
Или можно сделать циклом так? :
Файлы по одному копируются в папки с названиями, состоящими из, допустим, первых пяти символов копируемого файла?

Добавлено через 3 минуты
И вообще, по сути, имена папок не имеют значения. Самое главное- чтобы файлы с одинаковым номером (но разным префиксом) из двух исходных папок попали в одну, и не важно, какое имя она будет иметь.
0
Dragokas
Эксперт WindowsАвтор FAQ
17007 / 7063 / 856
Регистрация: 25.12.2011
Сообщений: 10,881
Записей в блоге: 16
22.04.2014, 11:23 4
Лучший ответ Сообщение было отмечено wmzkot как решение

Решение

Цитата Сообщение от wmzkot Посмотреть сообщение
cam*_000*.jpg
так jpg или jpeg ?

Цитата Сообщение от wmzkot Посмотреть сообщение
Идеально было бы по порядку.
Много способов.
Можно прямо так и перечислить все по номерам:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
set src=укажите путь к папке, где находятся Camera_1 и Camera_2 (без кавычек)
set dest=укажите путь к папке, где создавать папки к каждой паре jpg
 
cd /d "%src%"
 
for /L %%C in (0,1,9999) do (
  set num=000%%C
  set num=!num:~-4!
  rem echo F | xcopy /c /h /r /y "Camera_1\cam1_!num!.jpg" "%dest%\cam!num!"
  if exist "Camera_1\cam1_!num!.jpg" xcopy /c /h /r /y /i "Camera_1\cam1_!num!.jpg*" "%dest%\cam_!num!"
  if exist "Camera_2\cam2_!num!.jpg" xcopy /c /h /r /y /i "Camera_2\cam2_!num!.jpg*" "%dest%\cam_!num!"
)
pause
Если будет слишком медленно, можно выделять из имени файлов часть с цифрами:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
 
set src=укажите путь к папке, где находятся Camera_1 и Camera_2 (без кавычек)
set dest=укажите путь к папке, где создавать папки к каждой паре jpg
 
cd /d "%src%"
 
call :CopyEachFileToFolder "%src%\Camera_1" "%dest%" *.jpg
call :CopyEachFileToFolder "%src%\Camera_2" "%dest%" *.jpg
pause
Exit /B
 
:CopyEachFileToFolder
  For %%a in ("%~1\%~3") do (
    set fileJustName=%%~na
    set Fold=!fileJustName:~5,4!
    2>NUL md "%~2\!Fold!"
    copy /y "%~1\%%a" "%~2\!Fold!"
  )
Exit /B
1
wmzkot
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 3
22.04.2014, 13:47  [ТС] 5
Спасибо большое! Всё получилось. правда на выходе код немного изменился:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@echo 
SetLocal EnableExtensions EnableDelayedExpansion
 
set src=c:\PanoraVid\Source
set dest=c:\PanoraVid\Output
 
cd /d "%src%"
 
for /L %%C in (0,1,9) do (
  set num=00000%%C
  rem echo F | xcopy /c /h /r /y "Camera_1\Cam1_!num!.jpeg" "%dest%\cam!num!\"
  if exist "Camera_1\Cam1_!num!.jpeg" xcopy /c /h /r /y /i "Camera_1\Cam1_!num!.jpeg" "%dest%\cam_!num!\"
  if exist "Camera_2\Cam2_!num!.jpeg" xcopy /c /h /r /y /i "Camera_2\Cam2_!num!.jpeg" "%dest%\cam_!num!\"
) 
for /L %%C in (0,1,99) do (
  set num=0000%%C
  rem echo F | xcopy /c /h /r /y "Camera_1\Cam1_!num!.jpeg" "%dest%\cam!num!\"
  if exist "Camera_1\Cam1_!num!.jpeg" xcopy /c /h /r /y /i "Camera_1\Cam1_!num!.jpeg" "%dest%\cam_!num!\"
  if exist "Camera_2\Cam2_!num!.jpeg" xcopy /c /h /r /y /i "Camera_2\Cam2_!num!.jpeg" "%dest%\cam_!num!\"
)
for /L %%C in (0,1,999) do (
  set num=000%%C
  rem echo F | xcopy /c /h /r /y "Camera_1\Cam1_!num!.jpeg" "%dest%\cam!num!\"
  if exist "Camera_1\Cam1_!num!.jpeg" xcopy /c /h /r /y /i "Camera_1\Cam1_!num!.jpeg" "%dest%\cam_!num!\"
  if exist "Camera_2\Cam2_!num!.jpeg" xcopy /c /h /r /y /i "Camera_2\Cam2_!num!.jpeg" "%dest%\cam_!num!\"
)
for /L %%C in (0,1,9999) do (
  set num=00%%C
  rem echo F | xcopy /c /h /r /y "Camera_1\Cam1_!num!.jpeg" "%dest%\cam!num!\"
  if exist "Camera_1\Cam1_!num!.jpeg" xcopy /c /h /r /y /i "Camera_1\Cam1_!num!.jpeg" "%dest%\cam_!num!\"
  if exist "Camera_2\Cam2_!num!.jpeg" xcopy /c /h /r /y /i "Camera_2\Cam2_!num!.jpeg" "%dest%\cam_!num!\"
)
pause
А именно: добавились несколько циклов с разными значениями num=0000%%C. Все потому, что файлы в папках пронумерованы шестью цифрами (000000-999999) и при копировании затрагивались лишь файлы с четырьмя нулями (000010-000099). Поэтому пришлось добавить еще несколько циклов, чтобы копировать остальные файлы (от 000000 до 000009, от 000100 до 000999, от 001000 до 009999).
Думаю, что этого можно избежать для оптимизации кода, но я пока в этом не разобрался.

И вот такой еще вопрос: можно ли прекратить выполнение цикла по достижении количества раз, равного количеству файлов в директории? Или через еще один "set *****=%количество файлов в папке%", мне не сложно будет вбить руками количество файлов в батник перед выполнением.

Цитата Сообщение от Dragokas Посмотреть сообщение
так jpg или jpeg ?
Да без разницы, в общем-то. Если что, можно при копировании заменить *.jpeg на *.jpg или наоборот))) Да и в коде несложно заменить. Это я так, для примера привел расширение.
0
Dragokas
Эксперт WindowsАвтор FAQ
17007 / 7063 / 856
Регистрация: 25.12.2011
Сообщений: 10,881
Записей в блоге: 16
22.04.2014, 14:44 6
Всего навсего нужно было цифру в строке 11 подправить.
Цитата Сообщение от wmzkot Посмотреть сообщение
можно ли прекратить выполнение цикла по достижении количества раз, равного количеству файлов в директории?
Справедливое замечание. Учтём.

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
SetLocal EnableExtensions
 
set src=укажите путь к папке, где находятся Camera_1 и Camera_2 (без кавычек)
set dest=укажите путь к папке, где создавать папки к каждой паре jpg
 
cd /d "%src%"
 
For %%a in ("%src%\Camera1\*.jpg") do set /a total+=1
 
set c=0
:begin
  set num=00000%c%
  set num=%num:~-6%
  2>NUL md "%dest%\cam_%num%"
  2>NUL copy /y "Camera_1\cam1_%num%.jpg" "%dest%\cam_%num%"
  2>NUL copy /y "Camera_2\cam2_%num%.jpg" "%dest%\cam_%num%"
  set /a c+=1
if %c% LEQ %total% goto begin
pause
0
SERGEFFECT
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 4
10.02.2015, 10:41 7
Вот подобная тема кстати. Перенос файлов из папки в папки под порядковыми номерами Только вот теперь требуется обратно забрать раскиданные по папкам фаилы и перенести их в отдельную папку! Но не все фаилы, а только лишь один самый свежий с каждой папки. 1.2.3.4.5.6..744 . Заранее спасибо за ответ.
0
10.02.2015, 10:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2015, 10:41

Копирование всех файлов с заданным расширением из одной заданной папки в другую заданную папку
Создайте командный файл, который копирует все файлы с расширением, заданным в...

Создание папки по имени файла и перемещение файла в эту папку
Добрый день , Помогите пожалуйста с батником. У меня есть целая куча файлов...

Поиск на компьютере INI-файла и копирование найденного файла в папку определенного пользователя
Нужна ваша помощь! Нужно найти файл с расширением .ini и скопировать его в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru