Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Найти все папки, содержащих 2 определенные папки (кеш, бекап) (http://forum.oszone.net/showthread.php?t=351203)

blacks2 14-05-2022 05:28 2984991

Найти все папки, содержащих 2 определенные папки (кеш, бекап)
 
Здравствуйте

Прошу помощи с 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... скорее всего создает доп. нагрузку/время на анализ-сравнение
но.. другого решения в голове нет, а реализации тем более(

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



PS, ОФФТОП, FAQ

Зачем вообще?
- часть в общий 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 2985000

Код:

@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 2985272

Цитата:

Цитата megaloman
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%...
находились все варианты (равно как если поиск от корня диска)

Спасибо


заметка 1
При использовании поиска по разным логическим дискам, где:
Код:

:AnyDo
    ...
Exit /B 0

Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?)
заметка 2

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





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

megaloman 19-05-2022 18:46 2985345

Цитата:

Цитата blacks2
Можно ли "Exit /B 0" - заменить на "goto :EOF" (или неуместно?) »

Можно, а зачем? Это ничего не меняет.
Цитата:

Цитата blacks2
но в "логе", полученные пути-папки, содержащие кириллицу, выходили крякозяброй »

А чем смотрите? 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 2985577

Цитата:

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


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




Megaloman - V.2

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

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

* где Acrobat - получается искомая папка профиля
* а маркера-папки = "Code Cache" + "Cache" находятся внутри профиля

Результат работы V.2 :
(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"


Можно, а зачем? Это ничего не меняет.

Цитата:

Цитата megaloman
Можно, а зачем? Это ничего не меняет. »

это из-за необразованности - разницы не уловил, не усвоил
и goto :EOF в основном, на автомате, использую, когда список команд по CALL вызываю


Время: 23:49.

Время: 23:49.
© OSzone.net 2001-