Войти

Показать полную графическую версию : Сортировка файлов в каталоге с подкаталогами


Страниц : 1 [2]

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

Iska
28-10-2018, 13:21
И, кстати, через exist можно проверить наличие каталога просто указав в конце слэш "\" »
Совсем правильным будет так:
if exist "Some path\." (

)
— т.е., ссылка на самого себя.

alpap
28-10-2018, 16:19
то он у вас будет нумеровать вообще все файлы »
можно добавить:

...
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

megaloman
28-10-2018, 16:45
Для чего к имени выходного каталога добавлять расширение? Нет же такого требования в условии )) »@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

Amunrah
28-10-2018, 19:01
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

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

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

Amunrah
29-10-2018, 07:07
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


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

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

megaloman
29-10-2018, 13:18
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
Ваш первый батник отрабатывает нормально (разве что Ваш лог не нравится - но это мой испорченный вкус) ИМХО, если батник запускать многократно, тогда обязательно или в логе или в имени лога должна быть дата\время запуска

Amunrah
29-10-2018, 13:48
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

megaloman
29-10-2018, 14:50
Amunrah, @Echo Off
Set "BoxIn=Z:\Box_In\Мой контент\Книги"
Set "BoxOut=Z:\Box_Out\Книги"

Set "Mask=*.*"
rem Set "Mask=*.pdf *.fb2 *. *.epub"

Pushd "%BoxIn%" ||(Echo Input folder not found "%BoxIn%" &Pause &Exit /B 2)

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 %Mask% /B /S /A:-D /O:D`) DO (Set "Text=%%~xi." &Call :MySort "%%i" "%BoxOut%\%%Text:~1%%\%%~nxi" %Now%)
Popd
GoTo :Eof

:MySort
If Exist %2 If /I "%~t1"=="%~t2" Exit /B 1
If Not Exist "%~dp2" Md "%~dp2"
>>"%~dp2\^^_%3.Log" Echo %~t1 %1
>>"%BoxOut%\^^^_All_%3.Log" Echo %~t1 %1
Copy %1 %2 >nul
GoTo :EofЛог-файлы создаются для каждого расширения в каждой папке.
При многократном запуске наверное важен обзорный лог - сделал
Можно задавать список масок: выбирай хоть избранные файлы, хоть всеВаш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было.

Amunrah
29-10-2018, 16:43
megaloman,
Ваш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было. »
Как уже говорил, я не сторонник додумывать за окружающих и писать многофункциональный комбайн к банальному вопросу. Всех моментов все-равно не учесть, но, главное, это и незачем. Как гласит одна из прописных истин дзэн-питона - Простое лучше чем сложное. Переубеждать не стану конечно.
Мой вариант решает именно то, что озвучил топикстартер, не более. В forfiles к ошибке обычно приводит ключ /c (на некоторых виндах) поэтому вместо него рекомендуют использовать -с. В остальном все замечательно и утилита прекрасно справляется. Поэтому останусь при своем.

А ключ /D можно использовать (или не использовать) как в forfiles, так и в xcopy:
/D:m-d-y - Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.


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 -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt


ИМХО, это правильная идея, (каюсь, поленился сделать).
Рад что моя идея вам понравилась, но надо-ли оно кому-то пока вопрос... и шкалу прогресса прикрутить не забудьте, а то не комильфо :)

ChevConnor
31-10-2018, 18:20
Спасибо большое ребят. Очень помогли.

megaloman
12-11-2018, 14:38
Мне нужно чтобы файл работал в текущем каталоге, а он работает только по указанному пути в BoxIn BoxOut. ... чтобы запускаемый батник работал в текущем каталоге без указания пути?
Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted\"
Не очень помню задачу, замените эти строки наFOR /F "usebackq delims=" %%s IN (`CD`) DO Set "BoxIn=%%s"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
Set "BoxOut=%BoxIn%\sorted"

Echo BoxIn =%BoxIn%
Echo BoxOut=%BoxOut%
Echo, естественно, можно убить




© OSzone.net 2001-2012