Показать полную графическую версию : Архивирование каталога
Здравствуйте!
Помогите, пожалуйста, со следующими вопросами.
1.
Есть каталог Src и каталог Dst.
Требуется создать батник, который будет запускаться периодически, т.е. от случая к случаю, и который будет добавлять архивы ВСЕХ каталогов, включая их подкаталоги, из Src в Dst с именами архивов, совпадающими с именами каталогов первого уровня из Src.
То есть, после отработки такого батника, в Dst должны создаться все несуществующие там архивы с именами, совпадающими с именами каталогов первого уровня из Src.
Архивы в Dst могут быть как *.rar, *.zip, *.7z и пр. одновременно. Важны лишь сами имена без их архивного расширения.
В целях ускорения работы такого батника при его повторных запусках, хотелось бы, чтобы при наличии в каталоге Dst архивов (*.rar, *.zip, *.7z и пр.) с именами каталогов из Src, эти каталоги из Src повторно в Dst не переархивировались.
То есть, если запустить такой батник в случае, когда в Dst уже имеются все имена архивов, совпадающие (без учёта архивного расширения типа .rar, .zip, .7z и пр.) c именами каталогов первого уровня из Src, то такой батник ничего не должен создавать или перепаковывать.
При этом должно быть допустимым наличие в Dst прочего содержимого - как файлов, так и папок, которые вообще не имеют отношения к именам из Src.
2.
Если предположить частный случай по первому вопросу - имена каталогов первого уровня в Src находятся в формате даты YYYYMMDD, хотелось бы отдельным батником установить реальные даты создания/изменения этих каталогов в соответствии с их именами. Время не важно.
Буду признателен за помощь.
Чересчур дурная лабораторка.
megaloman
02-11-2018, 18:25
UserX, @Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги\*.*"
Set "Dst=Z:\Книги.arc"
Set Arc="C:\Program Files\7-Zip\7zG.exe" a -r
Set "Ext=7Z"
If Not Exist "%Dst%" Md "%Dst%"
FOR /D %%d IN ("%Src%") DO (
If Not Exist "%Dst%\%%~nxd.*" (Echo "%%d" &%Arc% "%Dst%\%%~nxd.%Ext%" "%%d\*.*")
)
pauseхотелось бы отдельным батником установить реальные даты создания/изменения этих каталогов в соответствии с их именами. Время не важно. » Моя Ваша не понимайт.
Есть, например, папка 20180925. Что должно происходить в батнике и какой результат его работы?
Моя Ваша не понимайт. »
Я ж говорил — лабораторка дурная :).
megaloman, огромное Вам спасибо за Ваш отклик без излишней демонстрации своего превосходства над оппонентом.
Сейчас опробую Ваш батничек и отпишусь.
Цитата megaloman:
Есть, например, папка 20180925. Что должно происходить в батнике и какой результат его работы? »
Да просто эта эта папка 20180925 должна получить дату своего создания и изменения 25.09.2018, и всё. :)
Iska, и вам спасибо за то, что оказались неравнодушны. Ибо, как сказал Юлиус Фучек: "Бойся равнодушных! Это с их молчаливого согласия совершается всё зло на земле!"
Очевидно, вас бояться не следует.
Что значит получить? »
Это значит, что дорога лежит в PowerShell, поскольку на пакетных файлах нет средств для задания таких свойств в принципе (сторонние средства в расчёт не берём), на WSH свойства .DateCreated/.DateLastModified — только для чтения (дату последней модификации ещё можно задать посредством Shell → Folder → FolderItem.ModifyDate, но больно уж извращённый способ получается).
Цитата megaloman:
Что значит получить? »
Это значит, что дата создания этой папки не совпадает с датой, определяемой именем папки. Хотелось бы это устранить и привести в соответствие.
megaloman, проверил Ваш батник.
Немного его изменил под себя и всё ПРЕВОСХОДНО сработало.
Огромное Вам спасибо!
----------------------------
@Echo Off
cls
Set "Src=C:\111\Src\*.*"
Set "Dst=C:\111\Dst"
Set Arc="C:\Program Files\WinRar\Rar.exe" a -r -ep1 -dh -m5 -s -rr5p -ts+ -y
Set "Ext=rar"
If Not Exist "%Dst%" Md "%Dst%"
FOR /D %%d IN ("%Src%") DO (
If Not Exist "%Dst%\%%~nxd.*" (Echo "%%d" &%Arc% "%Dst%\%%~nxd.%Ext%" "%%d\*.*")
)
----------------------------
Если не использовать ключ -ep1, то в архиве сохраняется весь путь C:\111\Src\Cat_name
Ключ -ep1 подавил сохранение в архиве лишнего пути, правда, несколько больше, чем хотелось бы. :)
А без этого ключа задача как-то решается?
megaloman, а я понял так, что дату создания и дату последней модификации каталога надо задавать по содержащейся в его имени дате (время при этом несущественно).
Цитата megaloman:
То есть, если папка 20180925 изменялась 20180929, то её надо переименовать? 20180925-->20180929 »
Не-не, вообще ничего переименовывать не нужно. Просто в результате обычного копирования были утрачены исходные даты создания папок. Но эти исходные даты создания папок являются именами этих папок.
Так что нужно взять папку с именем 20180925 и (можно даже ничего не проверяя) установить ей дату 20180925.
Соответвственно, папка с именем 20180929 должна получить дату 20180929.
То есть, после отработки, батник должен привести дату создания файла в соответствие с его именем.
Извините, пожалуйста, что не слишком понятно ставил вопрос.
megaloman
02-11-2018, 20:39
Ключ -ep1 подавил сохранение в архиве лишнего пути, правда, несколько больше, чем хотелось бы »
UserX, @Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Mask=*.*"
Set "Dst=Z:\Книги.arc"
Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m5 -s -rr5p -ts+ -y
Set "Ext=rar"
If Not Exist "%Dst%" Md "%Dst%"
Pushd "%Src%" &&(
FOR /D %%d IN ("%Mask%") DO (
If Not Exist "%Dst%\%%~nxd.*" (Echo %%~td "%%d" &%Arc% "%Dst%\%%~nxd.%Ext%" "%%d\*.*")
)
Popd
)
pause
Здесь Mask - это маска имён папок (не файлов!). Можно, например, задать 20??????.Iska, Вы поняли, что надо изменить атрибуты файлана пакетных файлах нет средств для задания таких свойств в принципе (сторонние средства в расчёт не берём »Тогда мне не фиг ловить в рамках этого решения делать нечего.
А так, Если не использовать ключ -ep1? »
Всё чётко сработало как мне было и нужно! Теперь в имени архива находится и имя папки, совпадающее с именем архива, но это я вижу дополнительным преимуществом, поскольку в случае переименования архива, внутри него останется правильное исходное имя папки.
Огромное Вам спасибо! В батниках Вы не просто мегаломэн, а настоящий мегалодон! :up
а настоящий мегалодон! »
https://ic.pics.livejournal.com/congregatio/44200227/803831/803831_original.jpg
megaloman
02-11-2018, 23:55
Iska, @Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Mask=20??????."
Set "TD=%Date%"
FOR /D %%d IN ("%BoxIn%\%Mask%") DO Set "DD=%%~nd" &Call :ReData %%DD:~6,2%%.%%DD:~4,2%%.%%DD:~0,4%% "%%d"
Date %TD%
pause
GoTo :Eof
:ReData
Date %1
Ren %2 "%~nx2.tmp" ||Exit /B 2
Md %2 &&(
For /F "usebackq delims=" %%i IN (`2^>nul Dir /B "%~2.tmp"`) DO (
Move "%~2.tmp\%%i" "%~2\" >nul
)
Rd "%~2.tmp"
)
GoTo :Eof
megaloman, это работает!! Вы - просто супер. :clapping:
megaloman, мне невероятно понравилась Ваша идея с маской.
С такой идеей мою частную задачу (лабораторку) можно обобщить на более общую задачу.
Допустим, есть группа файлов (папок), имена которых связаны с датой их создания. Например:
<Info1>2018<delimeter>10<delimeter>??<Info2>
где
<Info1> и <Info2> (вместе с символами < и >, которые используются лишь для улучшения читабельности) - некоторые тексты, являющиеся необязательной частью имени файла. <Info1> и/или <Info2> - произвольный текст, который может и отсутствовать;
<delimiter> - символ-разделитель между годом, месяцем и днём в имени файла. Может быть не один, а может и вовсе отсутствовать;
Например, если указывается маска:
Set "Mask=File_2018-10-??_Original"
то подразумевается, что данная маска будет читаться так:
"Группа всех файлов (каталогов), начинающаяся со слова "File_" и заканчивающаяся словом "_Original" за весь октябрь месяц 2018 года.
Теперь сама задача.
Очень хотелось бы модифицировать Ваш последний скрипт, таким образом, чтобы по указанной маске из каталога Src выбирался ТОЛЬКО ОДИН самый последний по сортирумому имени файл и, если архива с таким именем нет в каталоге Dst, то он туда архивировался.
То есть из приведённой маски:
File_2018-10-??_Original
из Src должен выбраться только один файл с именем "File_2018-10-31_Original" (или другой последний, если за 31.10.2018 ничего нет) и архивироваться в Dst при отсутствии в нём архва с таким именем.
Оно, конечно, в приведённой маске указание направления сортировки с Ascending на Discending могло бы вместо последнего октябрьского файла 2018 года выбрать первый октябрьский файл 2018 года, но это уже может оказаться перебором с моей стороны.
Я извиняюсь, если вдруг подкидываемые мною "лабораторки" стали выглядеть как некоторая наглость со стороны человека, который сам только теоретизирует, а делать за него должен кто-то другой.
Ничего такого в мыслях не было. Просто подкинутая в Вашем скрипте идея маски меня совершенно свела с ума своим великолепием и очень захотелось её практически применить с максимальной эффективностью.
megaloman
04-11-2018, 22:48
@Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Mask=File_2018-10-??_Original."
Set "Dst=Z:\Книги.arc"
Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"
Set "LastDir="
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /A:D /B /O:N`) DO Set "LastDir=%%d"
If "%LastDir%"=="" (Echo Folder not Found "%Src%\%Mask%\" &Pause &Exit /B 1)
If Not Exist "%Dst%" Md "%Dst%"
Pushd "%Src%" &&(
If Not Exist "%Dst%\%LastDir%.*" (Echo "%Src%\%LastDir%\" &%Arc% "%Dst%\%LastDir%.%Ext%" "%LastDir%\")
Popd
)
pause
GoTo :Eof
megaloman, да, с каталогами в папке Src это теперь прекрасно работает!
А можно ли сделать так, чтобы в каталоге Src могли быть не только вложенные папки, к которым будет применима такая маска, но и просто файлы, к которым будет применяться та же самая маска?
То есть, различия между папкой или файлом в каталоге Src для архивирования быть не должно, а маска должна одинаково относиться и к файлам, и к папкам.
Таким образом архивироваться в каталог Dst будут или файл, или папка из Src, в зависимости от того, чьё имя старше с точки зрения даты, являющейся частью имени.
Или такое возможно только либо-либо, то есть, либо в каталоге Src будут папки и тогда файлы будут игнорироваться, либо файлы, но тогда будут игнорироваться каталоги?
Я ещё раз извиняюсь за наглость. :unsure:
megaloman
05-11-2018, 09:22
@Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Mask=File_2018-10-??_Original."
Set "Dst=Z:\Книги.arc"
Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"
Pushd "%Src%" || (Echo Folder not Found "%Src%" &Pause &Exit /B 2)
Set "Name="
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO Set "Name=%%d"
If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Pause &Exit /B 1)
If Not Exist "%Dst%" Md "%Dst%"
If Not Exist "%Dst%\%Name%.*" (Echo "%Src%\%Name%" &%Arc% "%Dst%\%Name%.%Ext%" "%Name%")
Popd
pause
GoTo :Eof
megaloman, Вы это сделали, и это работает!!
Огромное Вам спасибо! Вы - лучший.
Поделюсь с Вами мыслями.
Конечно, делать мешанину из файлов и папок в каталоге не совсем здОрово, но раз даже это проходит, значит, для Src, состоящего только из каталогов или только из файлов это будет работать точно, поскольку задача решена Вами в самом общем виде.
Потому просторы для этого решения открываются просто безграничные. Я пока не могу их даже полностью осмыслить до самого конца.
Практически, Вы сделали гипотезу батеньки Пуанкаре реальностью! :up:clapping:
PS
Вот осмыслю до конца и поглядим, какие новые проблемы создаст это решение. :)
megaloman, произошло некоторое осмысление. :)
Проверил работу скрипта при очень разной маске и с весьма разнообразным содержимым каталога Src.
Даже при пустой маске, т.е.:
Set "Mask="
на мой взгляд работает правильно. Пустая маска полностью соответствсует маске *.*
Т.е.
Set "Mask=" полностью эквивалентна Set "Mask=*.*"
И это, на мой взгляд, вполне логично.
Однако, коль скоро эти два варианта работают идентично, можно ли попросить Вас о модификации Вашего последнего скрипта таким образом, чтобы при задании пустой маски, т.е. при указании:
Set "Mask=", как исключение, скрипт работал несколько иначе.
А именно, если маска пустая, чтобы архивировались из каталога Src в каталог Dst не самый последний, а ВСЕ папки и ВСЕ файлы, архивов которых ещё нет в Dst.
Тогда этот один скрипт станет универсальным и заменит собой (и даже расширит) скрипт из первой задачи.
Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.