Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
1

Удалить дерево каталогов и все что в них лежит, если таких каталогов нет во втором

06.02.2013, 18:44. Просмотров 2215. Ответов 15
Метки нет (Все метки)

Помогите пожалуйста решить такую задачу.

Указываем два каталога. Если в первом каталоге во всем дереве нет папок которые есть в втором, значит из второго их все нужно удалить вместе с содержимым.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 18:44
Ответы с готовыми решениями:

Как красивее удалить дерево каталогов?
вполне логично. Лучше конечно выполнить от рута rm -rf / уверен, что это разрешит существующую...

Построение дерево каталогов и файлов как в проводнике - Что является корнем?
Есть ф-ция поиска файлов и каталогов, и построение дерева... void TfLocal::CreatePath(String...

Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений.
Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок...

Процедура: удалить из строки х1 все подстроки, совпадающие с х2, если таких подстрок нет, то вывести х1 без изменения
с помощью процедуры решить следующую задачу. даны 2 строки х1 и х2. удалить из строки х1 все...

Дан массив А(15). Найдите все элементы массива такие, что 5<А(1)<9. Если их нет, то напечатайте сообщение: "Таких элементов нет"
Кто может, помогите пожалуйста. Дан массив А(15). Найдите все элементы массива такие, что...

15
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
07.02.2013, 02:05 2
Попробуйте так:
Bash
1
2
3
4
5
6
7
8
9
@echo off
setlocal enabledelayedexpansion
set folder1=d:\1
set folder2=d:\2
for /f "delims=" %%i in ('dir /b /ad "%folder1%"') do set files=%%i
if "!files!"=="" (
   cd /d "%folder2%"
   rd /s /q "%folder2%"
)
Все из каталога в переменной folder2 будет безвозвратно удалено, сам каталог останется не тронутым.

Добавлено через 5 минут
Стоп!
Пропустил... Скрипт удаляет все из каталога 2 только если в первом нет каталогов вообще.
А Вам я так понял нужно сравнить все дерево из первого со вторым и если чего то нет в первом, тогда очистить второй?
0
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
07.02.2013, 22:45  [ТС] 3
Цитата Сообщение от Badger Посмотреть сообщение
А Вам я так понял нужно сравнить все дерево из первого со вторым и если чего то нет в первом,...
то это нужно удалить и во втором.

То есть первый каталог как бы эталон для второго в плане дерева папок.
0
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
08.02.2013, 17:34 4
Bash
1
2
3
4
5
6
7
8
9
@echo off
setlocal enabledelayedexpansion
 
set folder1=d:\--\temp\465\01
set folder2=d:\--\temp\465\02
 
for /f "delims=" %%a in ('dir /b /ad "%folder2%"') do (
  if not exist "%folder1%\%%~na" echo rd /s /q "%folder2%\%%~na"
)
Для "боевого" запуска уберите echo в 8й строке.
0
08.02.2013, 17:34
Eva Rosalene
Ladybug
4123 / 1597 / 304
Регистрация: 06.01.2013
Сообщений: 4,191
Завершенные тесты: 2
08.02.2013, 17:49 5
Лучший ответ Сообщение было отмечено как решение

Решение

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
setlocal enabledelayedexpansion
set f1=D:\1tree\
set f2=D:\2tree\
echo "!f1!" "!f2!!lastway!"
call :treek "!f1!" "!f2!"
echo.Complete
pause>nul
exit /b
:treek
if "%~1"=="" (exit /b)
if "%~2"=="" (exit /b)
for /f "usebackq tokens=*" %%a IN (`dir "%~2!lastway!" /A:D /B`) DO (
 echo "!%~1!%%~a\"
 if not exist "%~1%%~a\" (rmdir /S /Q "%~2%%~a") else (call :treek "!f1!%%~a\" "!f2!%%~a\")
)
exit /b
Рекурсивно, как вы любите

Цитата Сообщение от Badger Посмотреть сообщение
Для "боевого" запуска уберите echo в 8й строке.
Надо по всему дереву.

Запуск уже боевой...
P.S. В 5 строке остаток от прошлых попыток в лице !lastway!

Добавлено через 1 минуту
Хм, и в 13 тоже...
3
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
08.02.2013, 23:52  [ТС] 6
Цитата Сообщение от FraidZZ Посмотреть сообщение
P.S. В 5 строке остаток от прошлых попыток в лице !lastway!

Хм, и в 13 тоже...
Что это значит? Это не страшно? )

Если в указываемом нами адресе встречаются русские буквы, то скрипт не срабатывает.
А в остальном все работает замечательно, даже с точками в названии папок все работает замечательно, огромное спасибо!
0
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
09.02.2013, 00:01 7
Цитата Сообщение от SanekPlus Посмотреть сообщение
Что это значит? Это не страшно?
Врядли ... Думаю FraidZZ имел ввиду, чтобы Вы удалили эти переменные.

Цитата Сообщение от SanekPlus Посмотреть сообщение
Если в указываемом нами адресе папка 1 или 2 имеет русские буквы, то скрипт не срабатывает.
Проблема с кодировкой, пересохраните файл в кодировке 866.
1
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
09.02.2013, 01:15  [ТС] 8
Цитата Сообщение от Badger Посмотреть сообщение
Проблема с кодировкой, пересохраните файл в кодировке 866.
Спасибо!

Добавлено через 1 час 7 минут
Почему-то скрипт не работает если f1= папка Денвера(сборка апач+пхп) C:\WebServers\home\localhost\www\MyScripts\

Скрипт выдает:
"C:\WebServers\home\localhost\www\MyScripts\" "C:\Users\Alexander\Dropbox\Script
s\MyScripts\"
"\WebServers\home\localhost\www\MyScripts\1\"
"\WebServers\home\localhost\www\MyScripts\1\1\"
Не удается найти указанный файл.
"\WebServers\home\localhost\www\MyScripts\1\2\"
Не удается найти указанный файл.
"\WebServers\home\localhost\www\MyScripts\1\3\"
Не удается найти указанный файл.
"\WebServers\home\localhost\www\MyScripts\1\4\"
Не удается найти указанный файл.
"\WebServers\home\localhost\www\MyScripts\2\"
"\WebServers\home\localhost\www\MyScripts\2\1\"
Не удается найти указанный файл.
Complete

То есть вроде как он видит все эти папки, но почему-то не может найти указанный путь.
Денвер при этом выключен. Запускать от имени администратора пробовал
0
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
09.02.2013, 01:24 9
Попробуйте выложить сюда весь лог.
Закомментируйте в коде @echo off и запустите скрипт в командной строке с выводом в файл и выложите его сюда.
Bash
1
script.bat >> file.txt
0
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
09.02.2013, 01:55  [ТС] 10
Цитата Сообщение от Badger Посмотреть сообщение
Попробуйте выложить сюда весь лог.
Закомментируйте в коде @echo off и запустите скрипт в командной строке с выводом в файл и выложите его сюда.
Bash
1
script.bat >> file.txt
Если я меняю echo "!%~1!%%~a\" на @echo off
то скрипт выводит в фаил только это:
"C:\WebServers\home\localhost\www\MyScripts\" "C:\Users\Alexander\Dropbox\Script
s\MyScripts\"

Если ниче не меняю выводит такой лог как я написал выше, только конечные папки по другому называются
0
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
09.02.2013, 02:12  [ТС] 11
test.rar

Дело не в адресе денвера конечно же, просто скрипт творит странное

В общем вот архив, в нем две папки(v1 и v2) и этот батник в батнике поправьте в соответствии с вашими путями на эти папки. В v1 самая дальняя папка удалена, а в v2 она присутствует. По идее скрипт после запуска должен её удалить из v2.
Но на деле ему рвет башню в бесконечный цикл и в конечном итоге он так ничего и не удаляет.
0
SanekPlus
4 / 4 / 0
Регистрация: 06.02.2013
Сообщений: 24
09.02.2013, 02:23  [ТС] 12
А вот прикрепил первый вариант ошибки, которая у меня получается при боевом применении. (Папки обе идентичны за исключением самой последний вложенной папки в a1 , которая должна по идее удалиться из a2. + Лог странный)test2.rar

p.s./ Не забудьте поправить пути на ваши.
0
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
09.02.2013, 02:44 13
Ну Вы так и не преобразовали файл к дос кодировке, правда после преобразования натолкнулся на ошибку вложенности каталогов:
0
Миниатюры
Удалить дерево каталогов и все что в них лежит, если таких каталогов нет во втором  
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
09.02.2013, 03:24 14
Попробуйте заменить 15ю строку кода FraidZZ на это:
Bash
1
if not exist "%~1%%~a\" (rmdir /s /q "%~2%%~a") else (call :treek "%~1%%~a\" "%~2%%~a\")
1
Eva Rosalene
Ladybug
4123 / 1597 / 304
Регистрация: 06.01.2013
Сообщений: 4,191
Завершенные тесты: 2
09.02.2013, 15:37 15
Скорее всего файлы скрытые / системные

Добавлено через 2 минуты
Bagder, спасибо, поправил. Сам ошибки не заметил.
0
Badger
91 / 91 / 4
Регистрация: 25.06.2012
Сообщений: 278
15.02.2013, 17:00 16
Оказывается это еще умеет делать ROBOCOPY и всего то одной строкой:
Bash
1
robocopy /purge folder1 folder2
1
15.02.2013, 17:00
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 17:00

Копирование всех каталогов с одним заданным именем из множества неизвестных каталогов
Всем добрый день. Сложилась необходимость создания бекапа определенной папки в пользовательских...

Архивирование определённых файлов из разных каталогов с сохранением структуры этих каталогов
Здравствуйте. Суть задачи. Есть определенный каталог (C:\X), в котором в разных подкаталогах лежат...

Курсач горит,нужно организовать удаление каталогов и копирование каталогов
Народ кто нито помогите с курсачем нужно что бы каталоги удалял с запросом и каталоги перемещал,а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru