0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
1

Размножить папки по именам в таблице

22.05.2020, 18:37. Показов 1347. Ответов 20

Author24 — интернет-сервис помощи студентам
Коллеги, добрый день. Помогите решить проблему.

Есть набор папок (с фотографиями внутри). Папки имеют имя формата: ???? (4 цыфры). Например, 4562, 4576 и т.д.
Нужно эти папки дублировать еще 3 раза (со всем содержимым внутри):
Тоесть
из 4562 сделать 4563, 4564, 4565
из 4576 сделать 4577, 4580, 4581
и т.д.

Для правильной перенумерации есть таблица (Number.csv во вложении, с разделителем "запятая"). Первый столбик, это имя исходной папки. 3 следующие, это имена в которые нужно скопировать.

К тому же, в папке лежат фото с именами формата ????_00_01, ????_00_02 (и т.д.). ???? - совпадает с именем папки. При дублировании папок, файлы также должны сдублироваться и переименоваться согласно именам папок в которых они лежат.

В итоге все папки должны оказаться там же где, они лежат.

Во вложении прилагаю структуру папок (ЗАДАЧА.rar), а также готовый пример что должно в итоге получиться.

Нужен такой вот батник, который автоматизирует этот процесс. Его нужно поместить рядом с папками, которые дублируются, запустить и всё.


Пожалуйста помогите.
Вложения
Тип файла: rar ЗАДАЧА.rar (6.56 Мб, 2 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2020, 18:37
Ответы с готовыми решениями:

Создать папки с именами, соответствующими именам пользователей AD
Добрый день! Стоит задача на сетевом хранилище сделать папки с именами доменных пользователей Имя...

Для каждой папки добавить её имя ко всем именам файлов в ней
Всем привет. Подскажите, пожалуйста, как мне решить теперь следующую проблему. В папке, в...

размножить программу
Короче есть такая веселая kde плюшка, называется amor. Бегает по рабочему столу Тукс. ну и там...

Размножить текст
Set WA = CreateObject("Word.Application") Set WD = WA.Documents.Add(Путь) WD.Range.Copy текст...

20
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 19:33 2
Korzhik1991, жёсткие ссылки вместо копий не лучше?
0
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 19:35  [ТС] 3
FlasherX, надо попробовать. Я так понимаю веса практически не будет, но система будет их распознавать как реальный цельный обьект?

Можно тогда батником наделать этих жестких ссылок?

Но может не сработать, так как все файлы хранятся на сервере, а у меня нет к нему админских прав. По этому гемороюсь с копиями
0
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 19:40 4
Korzhik1991, админские права не нужны. Нужно только учитывать, что правка файла будет относиться ко всем его ссылкам.
0
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 19:42  [ТС] 5
FlasherX, как с именами папок и файлов внутри их. Они будут совпадать?

Можно батником это всё организовать?
0
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 20:35 6
Korzhik1991, можно:
Windows Batch file
1
2
3
4
5
6
7
8
@echo off&setlocal enabledelayedexpansion&chcp 1251>nul
pushd Исходник
for /f "tokens=1-4 delims=," %%a in ('type ..\Number.csv') do ^
if exist %%a\ call:l %%b %%a&call:l %%c %%a&call:l %%d %%a
exit
:l
if not exist %1\ >nul md %1
for %%j in (%2\*.jpg) do set "n=%%~nxj" &>nul mklink/h "%1\%1!n:~4!" "%%j"
0
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 20:45  [ТС] 7
FlasherX, хм...в архиве ЗАДАЧА я приложил примерную структуру из 3 папок, которые превращаются в 12.

Но в реальности этих папок 21 и они должны превратиться в 84 согласно таблице.

Так вот с 3 папками работает. Но когда делаю тоже с 21, то ничего не происходит (скриншот результата запуска батника: слева 21 папка так и осталась, справа 3 папки превратились в 12 как и положено).

В чем может быть проблема?

P.S. Это всё таки копии, а не жесткие ссылки?
Миниатюры
Размножить папки по именам в таблице  
0
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 20:55  [ТС] 8
FlasherX, мне кажется что проблема во второй строчке. Не нужно чтобы батник привязывался к конкретному месту. Он должен работать там, где лежит
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
22.05.2020, 21:05 9
Korzhik1991, пробуйте:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1-4 delims=," %%a in (number.csv) do (
    set "%%a=%%b %%c %%d"
)
for /f "tokens=* delims=" %%a in ('dir /ad/b') do (
    call :step_1 "%%a"
)
pause
exit
:step_1
for /f "tokens=1,2 delims==" %%a in ('set %~1') do (
    set temp_var=%%a
    if exist !temp_var! (
        call :step_2 "%%a" "%%b"
    )
)
exit /b
:step_2
for %%a in (%~2) do (
    xcopy /i %1 %%a
    ren "%%a\*.*" %%a_*.*
)
exit /b
Добавлено через 1 минуту
Примечание. Батник и number.csv кладёте, как и хотели в папку с каталогами
1
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 21:10 10
Korzhik1991, я исхожу из исходной информации. Сперва пишите одно и даёте конкретную структуру, а потом вдруг возникают новые условия. Новый вариант:
Windows Batch file
1
2
3
4
@echo off&setlocal enabledelayedexpansion&chcp 1251>nul
for /f "tokens=1* delims=," %%i in ('type Number.csv') do ^
if exist %%i\ for %%# in (%%j) do if not exist %%#\ md %%# & ^
for %%j in (%%i\*.jpg) do set "n=%%~nxj" &>nul mklink/h "%%#\%%#!n:~4!" "%%j"
Цитата Сообщение от Korzhik1991 Посмотреть сообщение
Это всё таки копии, а не жесткие ссылки?
С чего такой вывод? Размер на диске вырос? Нет.
1
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 21:14  [ТС] 11
Karen87, а вот это работает хорошо.
Но вот теперь нюанс.

А что если мне иногда нужно не 3 копии сделать, а всего 2 или 4? Тут может меняться ситуация
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
22.05.2020, 21:20 12
Цитата Сообщение от Korzhik1991 Посмотреть сообщение
А что если мне иногда нужно не 3 копии сделать, а всего 2 или 4? Тут может меняться ситуация
1) Почему Вы сразу не оговариваете всё в ТЗ?
2) Каким образом батник должен понять Ваши хотелки по количеству копий? Если конечно Вы в .csv файле будете указывать после первой запятой не 3, а другое количество имён , то можно попробовать что-то изобразить
0
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 21:23 13
Korzhik1991, мной дано лаконичное рабочее решение. Не моргаем.
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
22.05.2020, 21:36 14
Korzhik1991, если в csv после первой запятой соответствующее количество значений в зависимости от нужного количества копий, то:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1* delims=," %%a in (number.csv) do (
    set "%%a=%%b"
)
for /f "tokens=* delims=" %%a in ('dir /ad/b') do (
    call :step_1 "%%a"
)
pause
exit
:step_1
for /f "tokens=1,2 delims==" %%a in ('set %~1') do (
    set temp_var=%%a
    if exist !temp_var! (
        call :step_2 "%%a" "%%b"
    )
)
exit /b
:step_2
for %%a in (%~2) do (
    xcopy /i %1 %%a
    ren "%%a\*.*" %%a_*.*
)
exit /b
0
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 21:53  [ТС] 15
Блин, ребята Karen87, FlasherX, тут оказывается чем дальше в лес тем больше дров.
Спасибо за коды. Они работают.

Короче понятна суть задачи (сделать копии папок с именами из таблицы учитывая также и содержимое этих папок), но возникли нюансы.

Смотрите, такая фигня получается.

Есть папка в одной директории "Ошейники", "Поводки", "Шлеи" (имена могут быть разные), тут же лежит наш батник (обзовем BAT.bat) и файл с именами (та же самая таблица).
Внутри папок "Ошейники", "Поводки", "Шлеи" лежат свои папки с цифрами ????. И прикол заключается в том, что к примеру в ошейниках все папки нужно умножить (переименовать) в 4 раза, поводки и шлеи в 3 раза (тоесть, по сути сколько в таблице мы видим чисел в строке, столько и должно быть копий). Скрин 1 во вложении для обьяснения.

А еще прикол в том, а что если первая колонка не является исходной папкой, которую нужно дублировать, а к примеру вторая или третья. Скрин2 во вложении. Тоесть батник должен найти папку которая совпадает в числом в строке и скопировать её во все другие имена, которые находятся в этой строке. Надеюсь понятно. Обьясняю как могу.

Или всё же нужно чтобы именно первая колонка была исходной (как это ранее хорошо реализовали)?
Миниатюры
Размножить папки по именам в таблице   Размножить папки по именам в таблице  
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
22.05.2020, 21:56 16
Korzhik1991, на здоровье, но я попытаюсь продолжить теперь только в том случае, когда Вы удосужитесь изначально корректно описать ТЗ без дополнений после реализации
1
0 / 0 / 0
Регистрация: 31.01.2020
Сообщений: 76
22.05.2020, 21:58  [ТС] 17
Karen87 я прекрасно всё понимаю. Прошу прощения. Но нюансы возникают во время тестирования и я просто не могу их предугадать
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
22.05.2020, 22:02 18
Korzhik1991, они не могут возникать во время тестирования, если Вы изначально полностью понимаете и доносите до разработчика желаемое. Мне не сложно помочь, но я за конкретику. В своё время, когда я просил помощи в разработке автоматизации процесса, то тоже дополнял новыми условиями решение и это действительно надоедает. Если Вам это действительно нужно, то напрягитесь, напишите чёткое и полное ТЗ, я постараюсь помочь
0
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,112
22.05.2020, 22:14 19
Цитата Сообщение от Korzhik1991 Посмотреть сообщение
И прикол заключается в том, что к примеру в ошейниках все папки нужно умножить (переименовать) в 4 раза, поводки и шлеи в 3 раза (тоесть, по сути сколько в таблице мы видим чисел в строке, столько и должно быть копий).
На скриншотах никакой логической связи с ошейниками, поводками и шлеями не наблюдаю.

Цитата Сообщение от Korzhik1991 Посмотреть сообщение
Или всё же нужно чтобы именно первая колонка была исходной (как это ранее хорошо реализовали)?
Это куда проще. Зачем тут доп. сложности?
0
3048 / 1055 / 475
Регистрация: 29.05.2016
Сообщений: 4,437
23.05.2020, 01:10 20
Korzhik1991, с учётом пожеланий в 15 посте:
Windows Batch file
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
@echo off
for /f "tokens=1* delims=," %%a in (number.csv) do (
    set "%%a=%%b"
)
for /f "tokens=* delims=" %%a in ('dir /ad/b') do (
    pushd "%%a"
    call :step_1
    popd
)
exit
:step_1
for /f "tokens=* delims=" %%a in ('dir /ad/b') do (
    call :step_2 "%%a"
)
exit /b
:step_2
for /f "tokens=1,2 delims==" %%a in ('set %~1') do (
    call :step_3 "%%a" "%%b"
)
exit /b
:step_3
for %%a in (%~2) do (
    xcopy /i %1 %%a
    ren "%%a\*.*" %%a*.*
)
exit /b
Примечание.
Цитата Сообщение от Korzhik1991 Посмотреть сообщение
Или всё же нужно чтобы именно первая колонка была исходной
Обязательно выполнение данного условия
0
23.05.2020, 01:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2020, 01:10
Помогаю со студенческими работами здесь

Размножить фон
Всем привет подскажите как размножить картинку (которую загрузил пользователь) на свою страничку...

Как размножить УФ?
Всем привет делаю огромный проект, столкнулся с такой бедой, нужно размножить определенные условия...

Размножить инструкцию кода
У меня есть код, в коде есть количество строк инструкций: участок инструкции кода 1 участок...

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

Размножить символ, в зависимости от вводных
Задача: a.Получить от пользователя любой символ. Проверить, что длина полученного значения равна...

Как правильно размножить файлы?
Задача состоит в том, что мне нужно получить пять файлом с расширением 1.bin ... 5.bin и один файл...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru