PDA

Показать полную графическую версию : Найти все папки, содержащих 2 определенные папки (кеш, бекап)


blacks2
14-05-2022, 05:28
Здравствуйте

Прошу помощи с CMD скриптом


КРАТКО/АЛГОРИТМ
в назначенном пути

найти все "%папкиХ%" (рекурсия)
в корне которых, присутствует одновременно папка "%папкаА%" + "%папкаB%"

к всем найденным "%папкиХ%"
применить произвольный код

завершение



ПОДРОБНО
В моей системе, семье, браузеры на основе движка Chromium
Имена-папки профилей пользователей разные, добавляются/удаляются

Цель: очищать кеш, бекапы
в папках профилей, имя-путь которых не знаю/меняется

Как найти профиль, не зная его названия?
- В каждом профиле пользователя, на движке Chromium, есть стандартные папки
- значит, папку профиля можно найти если в нем есть "папкаА"+"папкаB"

Далее: к всем найденным папкиХ (где есть "папкаА"+"папкаB")
применить произвольный код (на бекап и/или очистку)

* папка профиля - мои профили названы англ буквами
но семья может... и минус, тире, @, пробел, кириллицу добавить в название…



Написать самостоятельно не смогу:
пытался… искал решение, собирал из отрывков снипетов...
навешивал на алгоритм команды...
...так осилить и не смог
решил обратиться к вам форумчане за помощью.


КАРКАС/АЛГОРИТМ
@echo off & chcp 866
:: EnableDelayedExpansion - желательно обойтись без него

:: где искать - "переключатель" (all =на всех логических дисках)
"search_mode=all"

:: где искать - папка по умолчанию
"search_path=c:\Users\%USERNAME%\AppData"

:: папки-маркеры расположенные в папке-профиле
"search_marker_dir1=Cache"
"search_marker_dir2=Code Cache"

:: если «search_mode=all» - поиск по всем лог. дискам / не равен – поиск по умолчанию
if /i "%search_mode%"=="all" (
for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do
set search_path=%%d
call search_pfofiles
) else (
call search_pfofiles
)
goto :exittt

:: ...

:exittt
echo OK
pause & exit


:search_pfofiles
for /D /R "%search_path%" /d поиск папки %%f рекурсивно in ( * ) do (

if exist "%%f\%search_marker_dir1%\" if exist "%%f\%search_marker_dir2%\" (

:: где %%f = найденЫЕ точно папкИ-профилей
:: произвольные действия-команды
echo %%f >> naprimer_test_file.txt
)
)
goto :eof



0=)
ясно понятно, что я "необразованный" в постановке кода в for....
ясно, внутри for ставить if exist... скорее всего создает доп. нагрузку/время на анализ-сравнение
но.. другого решения в голове нет, а реализации тем более(

Помогите пожалуйста скриптом
Всем откликнувшимся, заранее, огромное спасибо!




Зачем вообще?
- часть в общий cmd с необходимыми задачами
+ бекап закладок
+ очистка кешей браузера
* тестовый день в Firefox создал кеш на 750-800мб,
кеш же моих постоянных 10+ профилей =200-2000мб/мес на профиль)
* да, правильней выносить кеш в %TEMP% / отдельный диск / в оперативку
но частая переустановка системы, запоминание что где, не дает гарантии от "забыть"


Почему не специальные утилиты очистки и бекапа?
- потихоньку собираю cmd под себя, из разных сниппетов
- конкретно те задачи, которые нужны
- установка, запуск, сопряжение, расписание разрозненного софта
в разной последовательности, после перекидывание файлов...
и в довесок, по любому, на старте и финише, использование cmd...


Почему не искать сразу папки кешей Cache/Code Cache или файл закладок?
- в путях
c:\Users\%USERNAME%\AppData\Roaming\
c:\Users\%USERNAME%\AppData\Local\
могут встретиться папки с схожим названием кешей/закладок
а если поиск производиться по всем логическим дискам - тем более


Сам создаешь профили = знаешь путь, зачем нагружать систему поиском?
- с портабл бразуером - ок, хорошо
- с стейбл системой - ок, хорошо
- но при добавление новых профилей - править и cmd на очистку - можно забыть...
- на разных пк семьи, могут быть разные профили и везде найти+править cmd...


Почему папки, а не файлы в качестве маркеров?
- посмотрел профили на разных хромиум браузерах:
имеющиеся схожие файлы, большей частью могут быть удалены при глубокой очистке (журналы и тп)
или часть имен файлов отличается/отсутствуют в зависимости от «конторы браузера»

а нижеследующие папки есть у всех
User Data\Default\blob_storage\
User Data\Default\BudgetDatabase\
User Data\Default\Cache\
User Data\Default\Code Cache\
User Data\Default\databases\
User Data\Default\GPUCache\
User Data\Default\Service Worker\
User Data\Default\Sessions\
User Data\Default\Session Storage\


* плюс если кому понадобится, заметка: пути профилей Default по умолчанию
c:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\Chromium\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\BraveSoftware\Brave-Browser\Default\
c:\Users\%USERNAME%\AppData\Local\Yandex\YandexBrowser\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\Microsoft\Edge\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\Vivaldi\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\Maxthon\Application\User Data\Default\
c:\Users\%USERNAME%\AppData\Local\Opera\Opera\Default\

c:\Users\%USERNAME%\AppData\Roaming\Opera\Opera\
c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera\
c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera Beta\
c:\Users\%USERNAME%\AppData\Roaming\Opera Software\Opera Stable\
(профиль в Roaming, а кеш по умолчанию хранится в Local...)

c:\Users\%USERNAME%\AppData\Roaming\Mozilla\Firefox\Profiles\*******.default-release
c:\Users\%USERNAME%\AppData\Roaming\Mozilla\Firefox\Profiles\*******.default


Зачем столько браузеров?
- постоянных 2-3
- остальные установил посмотреть структуру папок профилей

megaloman
14-05-2022, 10:26
@Echo Off
cls
Set "BoxIn=Z:\Папка для поиска"
Set "BoxA=Папка A"
Set "BoxB=Папка B"

If Exist "%BoxIn%\%BoxA%\" If Exist "%BoxIn%\%BoxB%\" Call :AnyDo "%BoxIn%" "%BoxIn%\%BoxA%\" "%BoxIn%\%BoxB%"

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxIn%\"`) Do (
If Exist "%%d\%BoxA%\" If Exist "%%d\%BoxB%\" Call :AnyDo "%%d" "%%d\%BoxA%" "%%d\%BoxB%"
)
Pause
Exit /B 0

:AnyDo
Echo -------- Что то делаем %1
Echo %2
Echo %3
Exit /B 0

blacks2
19-05-2022, 05:09
Set "BoxIn=Z:\Папка для поиска"
Set "BoxA=Папка A"
Set "BoxB=Папка B" »
...


Замечательно! Почти.
Прогнал тестов 30+
На старом винте 5400 работает быстро.
Рад! Благодарю!



:(
"но" - сам удивился:


А) Поиск по пути c:\Users\%USERNAME%
- рекурсивно находятся только(!) конечные-самые глубокие папки, содержащие 2 маркера-папки:

...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\
...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Cache"
...\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Code Cache"

но, вот вышестоящая профиль-папка "Default" (в ней есть Cache и Code Cache) - не находится
...\Edge\User Data\Default\
...\Edge\User Data\Default\Cache\
...\Edge\User Data\Default\Code Cache\
(не единично, в некоторых профилях браузеров ситуация идентичная)


В) При поиске от корня диска (перебор лог дисков)
- тогда находятся все(!) варианты, и "глубокие" и "нужные"


Приношу свои извинения, но прошу, помогите доработкой-кодом:
когда и при поиске по пути c:\Users\%USERNAME%...
находились все варианты (равно как если поиск от корня диска)

Спасибо


При использовании поиска по разным логическим дискам, где:
:AnyDo
...
Exit /B 0
Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?)
были проблемы с кодировкой при тестовом выводе
Echo %1 >> "с:\test.txt"
в начале скрипта и прописан chcp 866, сохранён как 866...
но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй
(при выводе на экран все было ок)
вылечилось странно - из скрипта создал новый файл для лога...




PS
Огромная вам благодарность Megaloman
Давно не заходил на форум...
и рад, что вы еще здесь, откликаетесь, помогаете людям
Ваши уроки, снипеты, заметки и мне сильно помогали
Спасибо вам еще раз!

megaloman
19-05-2022, 18:46
Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?) »Можно, а зачем? Это ничего не меняет.но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй »А чем смотрите? Notepad? Тогда наоборот, надо сохранять в кодировке 1251
Вот вариант@Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Users\%USERNAME%\Edge\User Data\Default"
Set "BoxA=Папка A"
Set "BoxB=Папка B"

Set "Log=Z:\Users\%USERNAME%\LogFile.log"
>"%Log%" cd.
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxIn%" ^|FIND /I "\%BoxA%"`) Do (
If Exist "%%~dpd%BoxA%" If Exist "%%~dpd%BoxB%" (
>>"%Log%" (Echo +++ "%%~dpd"&Echo "%%d"&Echo "%%~dpd%BoxB%")
Call :AnyDo "%%~dpd" "%%d" "%%~dpd%BoxB%"
)
)
Pause
Exit /B 0

:AnyDo
Echo -------- Что то делаем %1
Echo %2
Echo %3
Exit /B 0
У меня работает, возможно, у Вас какие-то тонкости (скытые папки, например). Мне надо информация, по какому пути что не найдено.

blacks2
24-05-2022, 05:51
У меня работает, возможно, у Вас какие-то тонкости (скытые папки, например). Мне надо информация, по какому пути что не найдено. »


Благодарю за скорый ответ Megaloman !
За представленная вами v.2. Поиск вроде бы быстрее стал работать (субъективно)




Megaloman - V.2

A. Вот тут есть недочет/фича/баг =)

V.2 - находит И папки, если они входят в путь (например ..\Acrobat\Cache\Code Cache)
V.1 - находит правильно:
..\Acrobat\Cache\
..\Acrobat\Code Cache\

* где Acrobat - получается искомая папка профиля
* а маркера-папки = "Code Cache" + "Cache" находятся внутри профиля
(1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\"
(2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Cache"
(3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache"
------
(1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\"
(2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\blob_storage"
(3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache"
------
(1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\"
(2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache"
(3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache"
------
(1) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\"
(2) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Session Storage"
(3) "C:\Users\_________\AppData\LocalLow\Adobe\AcroCef\DC\Acrobat\Cache\Code Cache"

B. Поиск по всем логическим дискам
Работает только если ставить слеш после двоеточия: BoxI=c:\
* Без слеша ищет исключительно в c:\Users\%USERNAME%
* Первый пример работал с BoxI=c:



ИТОГ
Теперь даже не знаю: какой вариант лучше?

Если выпилить лог из V.2, останется: FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /B /S /A:D "%BoxI%" ^|FIND /I "\%BoxA%"`) Do (
If Exist "%%~dpd%BoxA%" If Exist "%%~dpd%BoxB%" Call :AnyDo "%%~dpd" "%%d" "%%~dpd%BoxB%"
)
= краткий, красивый,
= может даже быстрее...
Но баг-фича поиска по путям описанный выше, + c:\
И определить... какой вариант лучше, по командам-функциям/скорости/правильности... V.1 или V.2 сложно - знаний не хватает




Спасибо, походу по кодировке я справился ранее:
Пересоздал лог файл из cmd
- видно изначальная кодировка файла лога была другая,
а просматривал я в +другой
нежели той, в которой cmd писал и в которой записан сам лог файл)

Логи открывал в Notepad++

+ПРИМЕР
CMD chcp 1251 (записан как UTF8) - лог открыт как ___ (np++ автоматом в UTF8 открывает) = все ок
CMD chcp 866 (записан как 866) - лог открыт как 866 (np++ автоматом в ANSI открывает) = все ок

А В ЛОГ ВЫВОЖУ ТАК:

:AnyDo
Echo. & Echo. >> "%Log%"
Echo ------ & Echo --- >> "%Log%"
Echo (1) %1 & Echo %1 >> "%Log%"
Echo (2) %2 & Echo %2 >> "%Log%"
Echo (3) %3 & Echo %3 >> "%Log%"
Exit /B 0


- задачи по логам особо не стояло
- просто при тестах делаю вывод чтоб видеть
* но ваш пример Megaloman по любому полезен 5+
По поводу основного бывшего вопроса "находит только конечные папки"
Тут моя вина
Вы правы Megaloman!

Изначально:
Тестил ваш бланковый пример v.1 - все было ок
Про "конечные папки" не обратил внимания в первых тестах
И начал быстро на него навешивать свои call`ы для последующего встраивания

Попутно тестировал, и тут только заметил "конечные"
Подумал, что ваша ошибка...

После вашего v.2
решил бланковый v.1 заново попробовать
- и все работает
- даже не поверил с 2-4 попыток))
= находит как и "вышестоящие" так и "конечные"

Каюсь(моя ошибка в чем-то была, не нашел).

+РЕЗУЛЬТАТ
(1) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default"
(2) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Cache"
(3) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache"
(1) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def"
(2) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Cache"
(3) "c:\Users\_________\AppData\Local\Microsoft\Edge\User Data\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Code Cache"


Можно, а зачем? Это ничего не меняет. »
это из-за необразованности - разницы не уловил, не усвоил
и goto :EOF в основном, на автомате, использую, когда список команд по CALL вызываю




© OSzone.net 2001-2012