Показать полную графическую версию : Сортировка файлов в каталоге с подкаталогами
ChevConnor
26-10-2018, 19:37
Прошу помощи! У меня есть каталог ( папка ) с подкаталогами ( папками ). В каталоге есть файлы скажем .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
ChevConnor, начните с описания того, что должен делать алгоритм, когда в разных подкаталогах ему встретятся одноимённые файлы.
Cортировку выполнить копированием. »
Это новое слово в алгоритмизации. Мне лично — непонятное.
При этом чтобы после сортировки в файле .txt »
Каком файле?
ChevConnor
26-10-2018, 20:12
У меня есть папка, в ней файлы и папки (формата .txt .pdf .doc). Мне нужен сценарий, способный рассортировать файлы (и те что во вложенных каталогах) по расширению, в отдельном каталоге (папке) с подкаталогами, соответствующие расширению. Ну и чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений.
По тому "сценарию" (его подобию скорее) у меня сортируются файлы в каталоге в котором находится батник, а подкаталоги не затрагиваются. Дату\время последних изменений записывает в отдельном файле, это вроде получилось.
c датой\временем последних изменений »
изменений чего и где?
Дату\время последних изменений записывает в отдельном файле, это вроде получилось »
если речь об этом
DIR > sort\txt.txt »
то там информации намного больше чем требуется
а вообще не судьба открыть справку: dir /? и почитать как ею пользоваться?
ChevConnor
26-10-2018, 20:35
Понимал бы я как с подкаталогов скопировать файлы, я бы не создавал тему, проблема в этом у меня заключается
Понимал бы я »
проблема в этом »
за такими банальными вещами лезть на форум может подтолкнуть только необузданная лень при этом еще и игнорирование следовать советам.
ChevConnor
26-10-2018, 20:42
Увы, 2й день сижу, я в этом деле, не как вы, а новичок можно сказать, плоховато у меня с написанием, вот и решил попросить помощи у знающих людей, а советов, кроме как банально открыть dir /? как то и нету, одни подколы
ChevConnor, Вы не ответили на вопрос: что должен делать алгоритм, когда ему в разных каталогах встретятся одноимённые файлы? Например, в каталоге …\Моя папка\Моя новая папка ему встретился файл Мой любимый файл.doc, он его скопировал/переместил в каталог …\Моя любимая папка для сортировки\DOC под тем же именем Мой любимый файл.doc. Затем он встречает в каталоге …\Моя папка\Моя новая папка 2 файл с ровно тем же именем — Мой любимый файл.doc. Что должен сделать алгоритм?
Понимал бы я как с подкаталогов скопировать файлы, я бы не создавал тему, проблема в этом у меня заключается »
Far Manager, Alt-F7, Enter, Панель, (стать на первый найденный файл, Ctrl-GrayPlus, F6, End, {txt|pdf|doc}\, Enter) повторить три раза. Вручную это делается за пару минут безо всяких скриптов.
Ваша проблема в том, что Вы не можете сами для себя точно сформулировать задачу.
ChevConnor
26-10-2018, 20:50
Cоздать копию думаю. Просто файлов много и там названия неповторяющиеся (Pm1024zm.txt Pm1025zm.txt и т.д) не задумывался над этим
megaloman
26-10-2018, 20:54
@Echo Off
Set "BoxIn=D:\Мой контент\Книги"
Set "BoxOut=Z:\Box_Out\Книги"
Set "Ext=fb2 epub txt pdf txt"
For %%e IN (%Ext%) DO (
Md "%BoxOut%.%%e" 2>nul
>"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /Y /S "%BoxIn%\*.%%e" "%BoxOut%.%%e\"`) DO (
If Exist "%%i" Echo %%~ti "%%i"
))
)
GoTo :Eof @Echo Off
Set "BoxIn=D:\Мой контент\Книги"
Set "BoxOut=Z:\Box_Out\Книги"
Set "Ext=fb2 epub txt pdf txt"
For %%e IN (%Ext%) DO (
Md "%BoxOut%.%%e" 2>nul
>"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /L /S "%BoxIn%\*.%%e" "%Tmp%\"`) DO (
If Exist "%%i" (Copy "%%i" "%BoxOut%.%%e\" >nul &Echo %%~ti "%%i")
))
)
GoTo :Eof
ChevConnor
26-10-2018, 21:18
Немного не получилось, скрипт создал папки, с названием расширения, но ничего не копировал в них, лишь создавая пустой файл .log. Мне нужно понять, как сделать так, чтобы скрипт копировал\переносил файлы с подкаталогов и распределял их в отдельную папку с уже готовыми подкаталогами названия которых соответствуют расширению файлов.
Извиняюсь если непонятно обьясняю, просто 2й день уже голову ломаю, не мозг а каша..
megaloman
26-10-2018, 22:07
ChevConnor, Прикрепите к сообщению свой скрипт, переименованный в txt.
Похоже, у Вас неправильный путь к файлам. Добавьте к коду 2 строки для отладки.@Echo Off
Set "BoxIn=D:\Мой контент\Книги"
Set "BoxOut=Z:\Box_Out\Книги"
Set "Ext=fb2 epub txt pdf txt"
Dir "%BoxIn%\*.*" /S /B /A:-D
pause
For %%e IN (%Ext%) DO (
Md "%BoxOut%.%%e" 2>nul
>"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /L /S "%BoxIn%\*.%%e" "%Tmp%\"`) DO (
If Exist "%%i" (Copy "%%i" "%BoxOut%.%%e\" >nul &Echo %%~ti "%%i")
))
)
GoTo :EofСписок файлов отображается?
ChevConnor
26-10-2018, 22:22
вот, теперь вышло, большое спасибо!
ChevConnor
27-10-2018, 00:58
А в повершеле такое реально сделать? если можно объясните как, заранее благодарен.
А в повершеле такое реально сделать? »
Вы всё ещё кипятите? Тогда мы идем к вам! :)
если можно объясните как »
На счет объяснений... это, наверное, в умные книжки придется заглядывать...
А вообще, примерно так:
function make-cat {
process {
$a = $dst + '\' + $d + $_.extension
if (!(test-path $a -pathtype container)){
ni $a -type directory|out-null
if ($swchlog) {"Создан каталог $a"|out-file $log -enc utf8 -app}
}
}
}
function move-file {
process {
$i,$fdst=0,$null
$pthdst = $dst + '\' + $d + $_.extension
if (test-path ($pthdst + '\' + $_.name)){
$fdst = $pthdst + '\' + $_.basename
while (test-path ($fdst + $_.extension)){
$i = [int] $(if($fdst -match '.*_copy(\d+)'){
[int]$matches[1]
} else {0}) + 1
$fdst = $pthdst + '\' + $($_.basename -replace '_copy\d+') + '_copy' + "$i".padleft(3,"0")
}
$pthdst = $fdst + $_.extension
}
mi $_.fullname $pthdst
if ($swchlog) {
"Перемещён файл $($_.fullname) в каталог $($dst + '\' + $d + $_.extension)"|
out-file $log -enc utf8 -app
}
}
}
$src = 'd:\222' # Путь к каталогу для сортировки по расширению
$dst = '.\1' # Путь к целевому каталогу
$d = '!sort' # Префикс для каталогов по расширению
$log = 'log.txt' # Имя для логфайла
$swchlog = $true # Вести лог?
$list = dir $src -file -force -rec
$list|select extension -uni|make-cat # Создаем каталоги
$list|move-file # Перемещаем файлы
При совпадении имен целевых файлов, будет создаваться новое имя файла по шаблону:
Name_copyXXX.ext
где XXX - номер от 001 до 999
ChevConnor, не надо складывать результат работы туда же, откуда забираются файлы в работу:
Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted"
Вы пишите одно:распределить в отдельном каталоге с подкаталогами », а подразумеваете/делаете другое. Потому у вас и не получается со скриптами, что испытываете сложности с формулировками.
в повершеле такое реально сделать? если можно объясните как »
что значит: "объясните как"? - прочитайте учебник по powershell
там по порядку расписано какие есть команды, что они делают, как их использовать
когда будет общее представление о языке, тогда можно будет уже обсудить конкретные неочевидные моменты
а так не достаточно (по поводу даты изменения чего-то так и не дождался ответа, сделал просто лог с датой операции)?
@echo off
set "katalog=C:\papka"
set "out=C:\out"
if not exist "%out%" md "%out%"
pushd "%katalog%"
for /f "delims=" %%a in ('dir /a-d/b/s') do set "exp=%%~xa"& call :cpr "%%a" "%out%\%%exp:*.=%%" "%out%\log.txt"
popd
pause& exit
:cpr
if not exist "%~2" md "%~2"
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
)
exit /b
ChevConnor
27-10-2018, 20:57
Только с работы пришел, да лог с изменениями и датой подошел, спасибо огромное ребят, очень помогли
alpap Если счетчик не сбрасывать, то он у вас будет нумеровать вообще все файлы, стоит ему только раз получить значение...
megaloman
28-10-2018, 12:07
ChevConnor, @Echo Off
Set "BoxIn=D:\Мой контент\Книги"
Set "BoxOut=Z:\Box_Out\Книги"
rem Set "BoxOut=D:\Мой контент\Книги"
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 (
If /I Not "%BoxOut%%%~xi\"=="%%~dpi" (
If Not Exist "%BoxOut%%%~xi\*%%~xi" Md "%BoxOut%%%~xi"
>>"%BoxOut%%%~xi\^^^^^^_%Now%.Log" Echo %%~ti "%%i"
Copy "%%i" "%BoxOut%%%~xi\" >nul
)
)
GoTo :Eof Вот вариант: Файлы рассортировываются по каталогам с именами по расширению. Имена входного и выходного каталогов могут совпадать (так как к имени выходного каталога по любому добавится расширение файлов). В каждом каталоге по имени расширения добавляется лог-файл с именем ^^^^^_ГГГГММДДччммсс.log, где ГГГГММДДччммсс-время старта батника. Начало имени ^^^^^ -сделано для того, чтобы по алфавиту название было вверху.
В лог файле прописаны время изменения копируемого файла и его имя
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.