Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сортировка файлов в каталоге с подкаталогами

Ответить
Настройки темы
CMD/BAT - Сортировка файлов в каталоге с подкаталогами

Новый участник


Сообщения: 11
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: ChevConnor
Дата: 26-10-2018
Прошу помощи! У меня есть каталог ( папка ) с подкаталогами ( папками ). В каталоге есть файлы скажем .txt .doc .pdf
Мне нужно отсортировать их по расширению и распределить в отдельном каталоге с подкаталогами названия которых соответствуют расширению. Cортировку выполнить копированием. При этом чтобы после сортировки в файле .txt указывалась дата\время последних изменений
В том что я написал происходит следующее - файлы сортируются только из основного каталога, а из подкаталогов не затрагиваются, и каждый раз перезаписывает файл с временем\датой последних изменений.

@echo off
setlocal enabledelayedexpansion
xcopy *.txt sort\txt
DIR > sort\txt.txt
xcopy *.doc sort\doc
DIR > sort\doc.txt
pause

Отправлено: 19:37, 26-10-2018

 

Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman, Для чего к имени выходного каталога добавлять расширение? Нет же такого требования в условии ))
И, кстати, через exist можно проверить наличие каталога просто указав в конце слэш "\"

Отправлено: 13:06, 28-10-2018 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Amunrah:
И, кстати, через exist можно проверить наличие каталога просто указав в конце слэш "\" »
Совсем правильным будет так:
Код: Выделить весь код
if exist "Some path\." (
    …
)
— т.е., ссылка на самого себя.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:21, 28-10-2018 | #22


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата Amunrah:
то он у вас будет нумеровать вообще все файлы »
можно добавить:
Код: Выделить весь код
...
setlocal
 if not exist "%~2\%~n1%n%%~x1" (
  >nul copy "%~1" "%~2\%~n1%n%%~x1"
  >>"%~3" (cmd /v/c echo !date!_!time:~0,8!& echo copy "%~1" "%~2\%~n1%n%%~x1")
 ) else (
  set /a n+=1& goto cpr
 )
endlocal
exit /b

Последний раз редактировалось alpap, 28-10-2018 в 16:38.


Отправлено: 16:19, 28-10-2018 | #23


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата Amunrah:
Для чего к имени выходного каталога добавлять расширение? Нет же такого требования в условии )) »
Ну, если это лабораторка, тогда конечно ...
Код: Выделить весь код
@Echo Off
	Set "BoxIn=Z:\Box_In\Мой контент\Книги"
	Set "BoxOut=Z:\Box_Out\Книги"
	
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
	Set Now=%Now:~0,14%

	For /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /B /S /A:-D`) DO Call :MySort "%%i" "%BoxOut%" %Now%
GoTo :Eof

:MySort
	Set "NewDir=%~x1"
	If "%NewDir%"=="" Set "NewDir=.." 
	Set "NewDir=%~2\%NewDir:~1%"
	If Not Exist "%NewDir%" Md "%NewDir%"
	>>"%NewDir%\^^^^^^_%3.Log" Echo %~t1 %1
	Copy %1 "%NewDir%\" >nul
GoTo :Eof
Входная и выходная папка не должны совпадать
Однако, представьте себе, а что если файлы без расширения, с каким именем папку создавать? Поэтому, имхо, если по делу, лучше к имени выходного каталога добавлять расширение и туда копировать файлы. Кстати, в этом предложенном варианте при отсутствии расширения папка не создастся и файлы будут писаться прямо в выходной каталог.
Если всё же вам нужны строго определённые расширения,то
Код: Выделить весь код
@Echo Off
	Set "BoxIn=Z:\Box_In\Мой контент\Книги"
	Set "BoxOut=Z:\Box_Out\Книги"

	Set "Ext=.pdf .fb2 . .epub"

	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
	Set Now=%Now:~0,14%

	For %%e IN (%Ext%) DO (
		For /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*%%e" /B /S /A:-D`) DO Call :MySort "%%i" "%BoxOut%" %Now%
	)
GoTo :Eof

:MySort
	Set "NewDir=%~x1"
	If "%NewDir%"=="" Set "NewDir=.." 
	Set "NewDir=%~2\%NewDir:~1%"
	If Not Exist "%NewDir%" Md "%NewDir%"
	>>"%NewDir%\^^^^^^_%3.Log" Echo %~t1 %1
	Copy %1 "%NewDir%\" >nul
rem	Move /Y %1 "%NewDir%\" >nul
GoTo :Eof
При желании можно заменить Copy на Move

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 28-10-2018 в 16:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:45, 28-10-2018 | #24


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman
Цитата megaloman:
Ну, если это лабораторка, тогда конечно ... »
Просто у человека вполне конкретные пожелания были - раскидать не повторяющиеся (он это уточнял) файлы из имеющейся папки в отдельную по подпапкам с именами расширений. И вроде вполне логично, что файлы без расширений упадут в выходной каталог. А вот, если начать всякие допущения делать, то это действительно на лабораторку станет похоже, хотя дело ваше конечно, спорить не буду ) но тогда и нестандартные символы в путях, на подобии «» тоже учесть стОит...

А если не заморачиваться, то можно так:
Код: Выделить весь код
@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m *.* /s -c ^
"cmd /c xcopy @path %dest%\@ext\ /i /c /f /h /y">>%dest%\log.txt

exit

Последний раз редактировалось Amunrah, 28-10-2018 в 22:08.


Отправлено: 19:01, 28-10-2018 | #25


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Amunrah,
Цитата ChevConnor:
чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений. »
У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются.

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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 23:18, 28-10-2018 | #26


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman
Цитата megaloman:
Цитата:
чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений
. »
У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются. »
Хотя обработку файлов без расширений не заказывали (пока что автору вопроса оно не надо), но тоже решаемо. И дату в конце воткнуть, это да, обязательно)
Код: Выделить весь код
@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt
Но, если начинать, то можно еще предположить, что bat-ник будет использоваться не однократно (иначе зачем автоматизировать?). Тогда имеет смысл обрабатывать только свежие файлы (если скрипт будет запускаться, например, как ежедневное задание). Однако, опять-же, никто об этом не спрашивал...
Код: Выделить весь код
@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s /D:0 /c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt
Цитата:
Я не всегда решаю задачи, как они сформулированы пользователем, не всегда задача бывает, на мой взгляд, сформулирована оптимально. Каюсь, грешен, ищу решение, которое считаю наилучшим. Грешен, не всегда получается с первого раза этого добиться. Завидую безгрешным. Простите мне этот грех
Да все мы грешны... Просто уточнил, было как-то не очевидно. Все, вопрос снят, теперь понятно )

Последний раз редактировалось Amunrah, 29-10-2018 в 11:04.


Отправлено: 07:07, 29-10-2018 | #27


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата megaloman:
У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются.
Я не всегда решаю задачи, как они сформулированы пользователем, не всегда задача бывает, на мой взгляд, сформулирована оптимально. »
Ну, оптимально и не надо все файлы раскладывать по расширениям, т.к. банально некоторые теряют смысл в отрыве от контекста, например thumbs.db, desktop.ini. Логичнее обрабатывать конкретные заказанные пользователем типы.

Отправлено: 10:56, 29-10-2018 | #28


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Amunrah, Простите за занудство.
Цитата Amunrah:
можно еще предположить, что bat-ник будет использоваться неоднократно »
ИМХО, это правильная идея, (каюсь, поленился сделать), но Ваш код не работает: ОШИБКА: Не найдены файлы, отвечающие условиям поиска.
Возможно я извратил его недопустимым образом
Код: Выделить весь код
@echo off

set "src=Z:\Box_In\Мой контент\Книги"
set "dest=Z:\Box_Out\Книги"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s /D:0 /c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt

Ваш первый батник отрабатывает нормально (разве что Ваш лог не нравится - но это мой испорченный вкус) ИМХО, если батник запускать многократно, тогда обязательно или в логе или в имени лога должна быть дата\время запуска

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 13:18, 29-10-2018 | #29


Новый участник


Сообщения: 24
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman
Цитата megaloman:
ИМХО, это правильная идея, (каюсь, поленился сделать), но Ваш код не работает: ОШИБКА: Не найдены файлы, отвечающие условиям поиска
Ваш первый батник отрабатывает нормально (разве что Ваш лог не нравится - но это мой испорченный вкус) ИМХО, если батник запускать многократно, тогда обязательно или в логе или в имени лога должна быть дата\время запуска

Странно, у меня нормально срабатывает. Спасибо что проверили. Можно еще так попробовать (возможно дело в написании ключа), к сожалению сейчас под рукой только один комп.

Код: Выделить весь код
@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

echo."Время начала запуска - %date% %time:~0,8%">>%dest%\log.txt

forfiles /p "%src%" /m * /s /D 0 -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Обработка завершена - %date% %time:~0,8%">>%dest%\log.txt

Отправлено: 13:48, 29-10-2018 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сортировка файлов в каталоге с подкаталогами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] получение списка имён файлов без имен папок (с подкаталогами) shadowbat Скриптовые языки администрирования Windows 6 20-12-2015 19:29
Любой язык - [решено] Архивирование файлов в каталоге Tonny_Bennet Скриптовые языки администрирования Windows 53 11-01-2015 13:11
CMD/BAT - Переименование файлов в каталоге flower Скриптовые языки администрирования Windows 2 28-11-2013 15:00
VBS/WSH/JS - Мониторинг файлов в каталоге ugol_divana Скриптовые языки администрирования Windows 1 03-08-2013 17:15
Любой язык - [решено] Распределение файлов в каталоге Тишина Скриптовые языки администрирования Windows 2 26-04-2013 17:09




 
Переход