Одна из задач инструмента экспорта, который есть в моем приложении, - очистить все .svn
каталоги от дерева каталогов моего приложения. Я ищу рекурсивную команду в оболочке Linux, которая будет проходить по всему дереву и удалять .svn
файлы.
Я не использую экспорт, так как этот скрипт будет использоваться для некоторых других имен файлов / каталогов, которые не связаны с SVN. Я попробовал что-то вроде:
find . -name .svn | rm -fr
Это не сработало ...
Ответы:
Попробуй это:
Перед тем, как запустить такую команду, я часто хотел бы сначала выполнить это:
источник
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
?ls
entries prop-base props text-base tmp
То, что вы написали, отправляет список имен файлов (и путей)
rm
, разделенных символом новой строки , но rm не знает, что делать с этим вводом. Ожидаются только параметры командной строки.xargs
принимает входные данные, обычно разделенные символами новой строки, и помещает их в командную строку, поэтому добавление xargs делает то, что у вас было:xargs
достаточно умен, чтобы передать столько аргументов,rm
сколько может принять. Таким образом, если у вас есть миллион файлов, он может выполнятьсяrm
1 000 000/65 000 раз (если ваша оболочка может принять 65 002 аргумента в командной строке {65k файлов + 1 для rm + 1 для -fr}).Как умело указали люди, также работают следующие:
Первые две
-exec
формы вызываютrm
каждую удаляемую папку, поэтому, если у вас есть 1 000 000 папок,rm
они будут вызваны 1 000 000 раз. Это конечно не идеально. Более новые реализацииrm
позволяют вам завершить команду+
указанием,rm
которое примет как можно больше аргументов:Последняя версия find / xargs использует print0, что заставляет find генерировать вывод, который используется
\0
как терминатор, а не как новая строка . Поскольку системы POSIX допускают любой символ, кроме\0
имени файла, это действительно самый безопасный способ убедиться, что аргументы правильно переданыrm
или приложение выполняется.Кроме того, есть элемент,
-execdir
который будет выполнятьсяrm
из каталога, в котором был найден файл, а не из базового каталога, и элемент,-depth
который будет начинаться с глубины.источник
Нет необходимости в каналах, xargs, exec или чем-либо еще:
Редактировать: Просто шучу, очевидно,
-delete
звонкиunlinkat()
под капотом, поэтому он ведет себя какunlink
илиrmdir
и будет отказываться работать с каталогами, содержащими файлы.источник
-delete
не трогать каталог, если он содержит файлы.-force
или рекурсивного флага-delete
, поэтому этот ответ бесполезен. Таким образом, он вернулся к|xargs rm -rf
, менее некрасиво типа , то-exec
с его уродливыми заполнителей и точкой с запятой:-exec rm -rf '{}' \;
.Уже есть много ответов для удаления .svn-директории. Но я хочу добавить, что вы можете избежать этих каталогов с самого начала, если вы сделаете экспорт вместо извлечения:
источник
Если вам не нравится видеть много
предупреждения, затем используйте
-depth
переключатель:источник
В Windows вы можете использовать следующий скрипт реестра, чтобы добавить «Удалить папки SVN» в контекстное меню правой кнопки мыши. Запустите его в любом каталоге, содержащем эти надоедливые файлы.
источник
У тебя почти было это. Если вы хотите передать вывод команды в качестве параметров другому, вам нужно использовать xargs. Добавление
-print0
гарантирует, что скрипт может обрабатывать пути с пробелами:источник
источник
В качестве важной проблемы, когда вы хотите использовать оболочку для удаления папок .svn, вам нужен аргумент -depth, чтобы запретить команде find входить в только что удаленный каталог и отображать сообщения об ошибках, например, например:
В результате вы можете использовать команду find, как показано ниже:
источник
Попробуй это:
Узнайте больше о команде find на developerWorks .
источник
В качестве альтернативы, если вы хотите экспортировать копию без изменения рабочей копии, вы можете использовать rsync:
источник