Как использовать терминал для рекурсивного удаления всех папок .svn?

56

Какую команду я могу ввести в Терминал, чтобы я мог удалить все .svnпапки в папке (и из всех подкаталогов), но не удалить ничего другого?

Mikey
источник
Может быть, вы могли бы просто svn export path/to/repo path/to/export/toвместо этого ...
Джонни
Следует отметить, svn exportчто он не копирует файлы, которые не являются частью SVN. Например, я хотел сделать это для приложения iOS, которое использует Какао-Бобы, где мы не фиксируем папку Бобов. Это было затем пропущено из вывода. Я закончил тем, что использовал что-то похожее на ответ Рича за то, что я хотел.
jackofallcode

Ответы:

120
cd to/dir/where/you/want/to/start
find . -type d -name '.svn' -print -exec rm -rf {} \;
  • Используйте find, которая делает рекурсию
  • в текущем каталоге.
  • Тип файла является каталогом
  • имя файла .svn
  • выведите то, что соответствует этой точке (.svn dirs)
  • выполнить команду rm -rf (thing found from find). {} является заполнителем для найденной сущности
  • ; говорит найти, что команда для exec выполнена. Поскольку оболочка также имеет представление о том, что; вы должны экранировать его с помощью \, чтобы оболочка не сделала с ним ничего особенного, а просто прошла, чтобы найти
Рич Гомолка
источник
2
Хорошее решение В то время как findесть -deleteона не будет удалять непустые каталоги. Этот подход более чист, чем, например, начало совпадения с частями всего пути файлов.
Даниэль Бек
13
Я бы рекомендовал запустить его без -exec rm -rf {} \;первого раза, чтобы убедиться, что он находит только то, что вам нужно. У меня никогда не было проблемы, когда я случайно удалял неправильную вещь, потому что всегда проверяю первым.
Роб
2
@ Хороший вопрос, я обычно делаю -exec echo rm -rf {} \; затем уберите эхо.
Rich Homolka
Другой вариант, если их не слишком много, - подтвердить удаление каждого файла с помощью-exec rm -ri {} \;
doovers
4
-exec rm -rf {} +вероятно, во много раз быстрее, потому что не нужно запускать слишком много rmэкземпляров. Вместо этого он упаковывает максимальное количество аргументов (в данном случае каталогов, которые нужно удалить) за один вызов. Это возможно, потому что rmпринимает несколько аргументов.
Даниэль Б