Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
1

Перемещение файлов с поиском по части имени перемещаемого файла

27.04.2014, 19:40. Просмотров 1266. Ответов 11
Метки нет (Все метки)

Добрый день всем умельцам написания скриптов. )

Есть задачка которая реализуется с помощью рук, двух открытых окон на рабочем столе и строки поиска, но меня не покидает мысль что решение этого мучения лежит в Bat. Прошу помощи. )

Задача такова:
есть папка "spisok" D:\Sort\spisok
есть папка "foto" D:\Sort\foto
В "spisok" заливаются пустые папки с названиями "256568bart1" название естественно всегда произвольные.
В "foto" находятся фотографии с именами содержащими часть имени папки находящейся в "spisok", допустим "56568bar"
Вбивая в поиске окна "spisok", название фотки вот таким образом *5*6*5*6*8*b*a*r*, находим полностью соответствующую папку и перемещаем в нее эту фотографию. Вот такая заморочка.
Возможно ли осуществление этого с помощью Bat?
Заранее благодарю за ответ.

Добавлено через 14 минут
Не соответствующие файлы с папками остаются там где и были )

Единственное на что хватило моих микро знаний в этом вопросе, это перенос файла из указанной папки в другую по указанному имени. (
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2014, 19:40
Ответы с готовыми решениями:

Как реализовать распределение файлов по папкам исходя из части имени файла?
Доброго времени суток, друзья! Есть папка в папке 200 - 300 файлов (И такие буду приходить...

Распределение файлов из папки по части имени файла в папки, содержащие файлы с похожим именем (квитовка)
Добрый день! Искал по форуму, но мне не удалось найти похожее решение. К примеру имеется...

Сортировка файлов по части имени
День добрый! Список файлов в папке: 5555-001-123.txt 5555-005-121.txt 5555-007-153.txt...

Копирование файлов по части имени
Всем привет! В папке лежат файлы с названиями: ...

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

11
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
30.04.2014, 19:41 2
Евгений Кабарди, здравствуйте !

Попробуем такой прием.
Посмотрим, на что способна команда cd

Bash
1
2
3
4
5
@echo off
SetLocal EnableExtensions
 
for %%f in ("D:\Sort\foto\*") do cd /d "D:\Sort\spisok\*%%~nf*" 2>NUL && move "%%f" .\
pause
0
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
01.05.2014, 17:31  [ТС] 3
cd супер ))
Попытался отрубить имя до _, чтоб в одну папку попадали две фотки (123 и 123_2), не выходит, буду пытаться разобрать, спасибо )

Добавлено через 3 часа 27 минут
Dragokas
С вашей подсказкой, пролилось немного света на все эти буквочки и символы ))
Немного подправил и все вышло )).
А есть ли вариант, в котором "delims=_" останавливается перед последним "_", пропуская несколько "_" в центре имени?

Bash
1
2
3
4
5
6
7
@echo on
SetLocal EnableExtensions
 
for %%f in (D:\Sort\foto\*.jpg) do (
    for /F "tokens=1* delims=_" %%b in ("%%~nf") do cd /d "D:\Sort\spisok\*%%~b*" 2>NUL && move "%%f" .\
    )
pause
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
01.05.2014, 21:20 4
Лучший ответ Сообщение было отмечено Евгений Кабарди как решение

Решение

Евгений Кабарди, нет такого. Только через пользовательскую функцию.

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
 
for %%f in ("D:\Sort\foto\*") do call :SendFoto "%%f"
pause
Exit /B
 
:SendFoto
  call :CutUntilLastChar "%~n1" "_" ret
  cd /d "D:\Sort\spisok\*%ret%*" 2>NUL && move "%~1" .\  
exit /B
 
:CutUntilLastChar [_in_string] [_in_last char delimiter] [_out_variable that receive a bufer]
  :: урезает строку до указанного разделителя, считая от конца строки
  :: если разделитель не найден, возвращается вся строка
  set "_var=%~1"
  :_CutUntilLastChar_loop
  if "%_var:~-1%"=="%~2" (if "%_var:~,-1%" neq "" set "%~3=%_var:~,-1%"& exit /B)
  set "_var=%_var:~,-1%"
  if "%_var%" neq "" (goto _CutUntilLastChar_loop) else (set "%~3=%~1")
Exit /B
1
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
02.05.2014, 12:47  [ТС] 5
Dragokas
Огромное спасибо, это конечно выглядит как разрыв мозга, но все же нужно разобрать по полочкам, очень полезное знание. Зачем стирать все в ручную, если есть СМА )).
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
02.05.2014, 17:16 6
Цитата Сообщение от Евгений Кабарди Посмотреть сообщение
СМА
Система машинной автоматизации ?
0
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
02.05.2014, 18:47  [ТС] 7
Стиральная Машина Автомат )))))))))))

Добавлено через 3 минуты
Возможно ли удалить все точки из имени, не убивая точку расширения? Так не выходит )
Bash
1
2
3
4
5
6
7
8
9
@echo off
setlocal
 
for /f "tokens=*" %%i in ('dir D:\Sort\foto /b') do call :ren "%%i"
goto:eof
 
:ren
set "file=%~1"
ren D:\Sort\foto\%1 %file:.=%
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
02.05.2014, 23:09 8
Так попробуйте:

Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal EnableExtensions
 
for /f "tokens=*" %%i in ('dir D:\Sort\foto /b /a-d') do call :ren "D:\Sort\foto\%%i"
pause
goto:eof
 
:ren
set "filename=%~n1"
ren "%~1" "%filename:.=%.*"
0
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
03.05.2014, 01:08  [ТС] 9
Получилась вот такая картинка.
mj123.452.jpg
mj123452.452.jpg
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
03.05.2014, 01:14 10
Ага, вижу. Через маску не хочет. Тогда так:

Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal EnableExtensions
 
for /f "tokens=*" %%i in ('dir D:\Sort\foto /b /a-d') do call :ren "D:\Sort\foto\%%i"
pause
goto:eof
 
:ren
set "filename=%~n1"
ren "%~1" "%filename:.=%%~x1"
0
Евгений Кабарди
2 / 0 / 0
Регистрация: 27.04.2014
Сообщений: 6
03.05.2014, 02:13  [ТС] 11
Колдовство. Работает супер.
А в чем секрет вот этого (%%~x1), как понять?

Добавлено через 26 минут
Нашел что то, теперь понятнее стало.
%~n1 - разворачивает %1 в имя файла
%~x1 - разворачивает %1 в расширение файла
0
Dragokas
Эксперт WindowsАвтор FAQ
17058 / 7113 / 861
Регистрация: 25.12.2011
Сообщений: 10,924
Записей в блоге: 16
03.05.2014, 02:20 12
%filename:.=%%~x1

1) замена в переменной filename точки на ничто.
2) получение первого аргумента, переданного в подпрограмму.
Модификатор ~x означает убрать кавычки (~) и выделить из пути только часть с расширением имени файла (x).
Более подробно здесь.
0
03.05.2014, 02:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2014, 02:20

Поиск и перемещение файлов по имени с созданием структуры папок
Коллеги, приветствую! Очень надеюсь на помощь знающих людей, т.к. сам не силен в написании...

Переименование файлов с удалением части имени
Добрый день! Понимаю, что задача простая, но сходу я не смог её осилить... :mda: Вот что в...

Переименование и архивация файлов по части имени
Здравствуйте! Помогите со следующей задачей. Есть папка в которой находятся множество файлов с...


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

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

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