Командная строка для рекурсивного удаления совпадающих файлов и каталогов

Как я могу рекурсивно удалить все файлы и каталоги, соответствующие определенному шаблону? например удалить все каталоги ".svn" и содержащиеся в них файлы?

(К сожалению, только DOS)


person Rory    schedule 10.02.2009    source источник


Ответы (6)


Поскольку вы ищете решение для DOS, сообщение прошлой недели было почти идентичным, и консенсус был таким:

Командная строка инструмент для рекурсивного удаления папки с указанным именем в Windows?

для / д / р. % d в (.svn) действительно ли @if существует "% d" rd / s / q "% d"

or

для / f "usebackq"% d in ("dir .svn / ad / b / s") do rd / s / q "% d"

Фактически, SVN также дает вам возможность экспортировать рабочий каталог без каталогов .svn / _svn.

Запоздалые мысли, три года спустя: я думаю, что причина, по которой людям в конечном итоге требуется рекурсивное удаление папок .svn / _svn, заключается в том, что они напрямую скопировали свою локальную рабочую копию в новое место, чтобы провести сравнение папок их измененной версии по сравнению с к чистому экспорту, т.е. после того, как что-то пойдет не так с измененной локальной рабочей копией. (По крайней мере, поэтому мне это нужно. Определенно проще / быстрее просто использовать svn export, когда это возможно.)

person JMD    schedule 10.02.2009
comment
Фактически, очевидно, TortoiseSVN также дает вам возможность экспортировать рабочий каталог без каталогов .svn / _svn. Я считаю, что это особенность самого svn (svn export), а не только TortoiseSVN, поэтому любой другой клиент тоже может это сделать. - person MatrixFrog; 15.06.2010
comment
Это было хорошо! Проводник Windows не всегда удалял файлы .svn. - person cbmeeks; 08.02.2012
comment
или попробуйте вариант DOS с жестким ядром, предложенный в superuser.com/questions/409479/ - person Gregor; 19.04.2012
comment
Что мне нужно изменить, если я хочу рекурсивно удалить имя файла с помощью этой команды? в настоящее время это работает только для папок - person Dev G; 11.07.2012
comment
У меня было более одного случая, когда мне нужно было уничтожить все каталоги .svn, потому что TortoiseSvn закрыл локальный репозиторий, часто в результате сбоя приложения в середине операции, попытки пользователя выполнить ветвление странным образом или недоразумения пользователя Вернуть или восстановить. - person Chris Moschini; 07.08.2012

Это Юникс или Винда? В Unix простое решение:

find . -name '.svn' -type d | xargs rm -rf

Выполняется рекурсивный поиск всех каталогов (-тип d) в иерархии, начиная с "." (текущий каталог) и находит те, чье имя - '.svn'; список найденных каталогов затем передается в rm -rf для удаления.

Если вы хотите попробовать, попробуйте

find . -name '.svn' -type d | xargs echo

Это должно предоставить вам список всех каталогов, которые будут рекурсивно удалены.

person Antti Huima    schedule 10.02.2009
comment
Я поддержал, потому что искал тот же вопрос на Win32, но с установленным gnutils - так что это отлично сработало для меня. Боже, чистая DOS - это такое безумие! - person Michael Paulukonis; 24.07.2010
comment
Голосование за поддержку - мне нужно было решение на основе unix, чтобы избавиться от ужасных файлов eclipse .project и .settings. Спасибо! : D - person gusterlover6; 21.02.2012
comment
Голосование против неправильного использования _1 _ + _ 2 _ + _ 3_. Вы должны всегда использовать -print0 и NUL прерывание в подобных ситуациях, иначе это просто катастрофа, ожидающая своего часа. - person TC1; 29.03.2012
comment
@Meltemi Прошло некоторое время, но 1) вопрос требует общего решения, '.svn' был просто приведенным примером и 2) имена файлов * nix могут содержать почти все, кроме байта NULL и косой черты в их. Пробелы - вредная вещь для этого, пример с пробелом в имени будет иметь каталог с именем foo bar где-то в иерархии и каталог с именем bar в текущем каталоге. Затем вы выполняете поиск foo*, он передает some/path/foo bar на rm, который молча терпит неудачу и удаляет bar. См. Ответ greyfade ниже или используйте -delete для поиска GNU. - person TC1; 16.02.2013
comment
хорошо, начинаю иметь смысл. Мне нужно было сделать что-то подобное сегодня, и я понятия не имел, что означают флаги -print0 или -0, и мне было трудно найти документацию. на Mac так много (большинство?) файлов / каталогов содержат пробелы ... так что ваш комментарий вызвал у меня любопытство. #funwithunix - person Meltemi; 16.02.2013
comment
FWIW- Для своих нужд я остановился на: find . -name '.svn' -type d -exec rm -rf '{}' + как бы загадочно, но работает ... - person Meltemi; 16.02.2013
comment
@Meltemi Важная часть, которую следует извлечь из всего этого, заключается в том, что ваша оболочка ничего не ускользает от вас, когда вы отправляете материал, цель просто считывает что-то из stdin - есть и другие неприятные случаи, rm - просто самый очевидный плохой. В этом случае, когда есть пробел, это то же самое, что выполнение rm -rf foo/bar baz - как только вы его запишете, это очевидно. Поскольку Darwin (Mac) технически является Unix, вы сможете найти документацию по вашему find в man, введите man find в оболочке. P.S. Ваш случай, вероятно, ведет себя забавно, если в имени файла есть апостроф. :) - person TC1; 16.02.2013

Если ваши файлы находятся в состоянии подрывной деятельности, то при экспорте из репозитория вы получите дерево каталогов с удаленными .svn-файлами и прочим мусором.

person Community    schedule 10.02.2009
comment
Просто имейте в виду, что экспортированная версия не будет содержать никаких незавершенных изменений, которые могут быть в вашем рабочем каталоге (для этого вам нужно будет зафиксировать, а затем экспортировать) - person Jaysen Marais; 28.01.2012

Что-то вроде этого может помочь, но, конечно, будьте осторожны!

find . -name ".svn" -exec rm -rf {} \;

Сначала попробуйте сделать что-то вроде этого, чтобы выполнить пробный прогон:

find . -name ".*" -exec echo {} \;

Обратите внимание, что пустые фигурные скобки заполняются именами файлов, а экранированная точка с запятой завершает выполняемую команду (начиная с «-exec»).

person dreeves    schedule 10.02.2009
comment
Это отлично сработало для меня. Спасибо! Мне нужно было удалить все каталоги CVS, поэтому я нашел. -name CVS -exec rm -rf {} \; - person cmcculloh; 24.02.2009

На * nix или Cygwin:

find -name .svn -print0 | xargs -0 rm -rf
person greyfade    schedule 10.02.2009
comment
Голосование за только правильное _1 _ + _ 2_ здесь. - person TC1; 29.03.2012

Если вы хотите скопировать его без экспорта и удаления .svn из проектов, вам следует использовать параметр / EXCLUDE из XCOPY.

Нравится:

xcopy /S/Q/EXCLUDE:svn.excludelist [path_from] [path_to\]

Обратите внимание на "\" (обратную косую черту) на [path_to]. Он определяет, что это выходной каталог, поэтому xcopy не будет спрашивать, является ли это файлом или каталогом.

Svn.excludelist - это текстовый файл, содержащий шаблоны, которые следует игнорировать при копировании, разделенные строкой.

Например:

.svn
.svn\
\.svn\
.obj
.o
.lib
\src\

И так далее...

person mannysz    schedule 08.07.2010