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

Согласно руководству PHP - parse_url должен не использоваться для проверки URL.

, К сожалению, кажется, что filter_var('example.com', FILTER_VALIDATE_URL) не работает немного лучше.

И parse_url() и filter_var() передаст уродливые URL такой как http://...

Поэтому в этом случае - regex лучший метод.

188
задан Peter Mortensen 2 July 2012 в 21:40
поделиться

10 ответов

Попробуйте следующее:

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

Прежде чем запускать такую ​​команду, мне часто нравится сначала запускать ее:

find . -name .svn -exec ls '{}' \;
432
ответ дан 23 November 2019 в 05:40
поделиться

Написанное вами отправляет список имен файлов, разделенных новой строкой (и путей ) на rm , но rm не знает, что делать с этим вводом. Ожидаются только параметры командной строки.

xargs принимает ввод, обычно разделенный символами новой строки, и помещает их в командную строку, поэтому добавление xargs заставляет работать то, что у вас было:

find . -name .svn | xargs rm -fr

xargs достаточно умен, чтобы он будет передавать в rm столько аргументов, сколько может принять. Таким образом, если у вас есть миллион файлов, он может запускаться rm 1 000 000/65 000 раз (если ваша оболочка может принимать 65 002 аргумента в командной строке {65k файлов + 1 для rm + 1 для -fr}).

Как искусно заметили люди, работают также следующие методы:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

Первые две формы -exec вызывают rm для каждой удаляемой папки, поэтому, если у вас есть 1 000 000 папок, rm будет вызываться 1 000 000 раз. Это, конечно, далеко не идеально. Новые реализации rm позволяют завершить команду с помощью + , указывающего, что rm будет принимать как можно больше аргументов:

find . -name .svn -exec rm -rf {} +

Последний find / xargs версия использует print0, что заставляет find генерировать вывод, который использует \ 0 как терминатор, а не перевод строки. Поскольку системы POSIX допускают любой символ, кроме \ 0 в имени файла, это действительно самый безопасный способ убедиться, что аргументы правильно переданы в rm или в выполняемое приложение.

Кроме того, есть '

51
ответ дан 23 November 2019 в 05:40
поделиться

Нет необходимости в каналах, xargs, exec или чем-то еще:

find . -name .svn -delete

Изменить: Шучу, очевидно -delete вызывает unlinkat () , поэтому он ведет себя как unlink или rmdir и отказывается работать с каталогами, содержащими файлы.

31
ответ дан 23 November 2019 в 05:40
поделиться

Для удаления каталога .svn уже есть много ответов. . Но я хочу добавить, что вы можете избежать этих каталогов с самого начала, если вы выполните экспорт вместо проверки:

svn export <url>
13
ответ дан 23 November 2019 в 05:40
поделиться

Если вам не нравится видеть много предупреждений

find: `./.svn': No such file or directory

, используйте -depth переключатель:

find . -depth -name .svn -exec rm -fr {} \;
12
ответ дан 23 November 2019 в 05:40
поделиться

Вы почти получили это. Если вы хотите передать вывод одной команды в качестве параметров другой, вам нужно будет использовать xargs. Добавление -print0 гарантирует, что сценарий может обрабатывать пути с пробелами:

find . -type d -name .svn -print0|xargs -0 rm -rf
9
ответ дан 23 November 2019 в 05:40
поделиться

В Windows вы можете использовать следующий сценарий реестра, чтобы добавить «Удалить папки SVN» в контекстное меню, вызываемое щелчком правой кнопки мыши. Запустите его в любом каталоге, содержащем эти надоедливые файлы.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""
9
ответ дан 23 November 2019 в 05:40
поделиться
find . -name .svn |xargs rm -rf
4
ответ дан 23 November 2019 в 05:40
поделиться

Попробуйте следующее:

find . -name .svn -exec rm -v {} \;

Подробнее о команде find см. developerWorks .

3
ответ дан 23 November 2019 в 05:40
поделиться

В качестве альтернативы, если вы хотите экспортировать копию без изменения рабочей копии, вы можете использовать rsync:

rsync -a --exclude .svn path/to/working/copy path/to/export
2
ответ дан 23 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: