Согласно руководству PHP - parse_url должен не использоваться для проверки URL.
, К сожалению, кажется, что filter_var('example.com', FILTER_VALIDATE_URL)
не работает немного лучше.
И parse_url()
и filter_var()
передаст уродливые URL такой как http://...
Поэтому в этом случае - regex лучший метод.
Попробуйте следующее:
find . -name .svn -exec rm -rf '{}' \;
Прежде чем запускать такую команду, мне часто нравится сначала запускать ее:
find . -name .svn -exec ls '{}' \;
Написанное вами отправляет список имен файлов, разделенных новой строкой (и путей ) на 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
или в выполняемое приложение.
Кроме того, есть '
Нет необходимости в каналах, xargs, exec или чем-то еще:
find . -name .svn -delete
Изменить: Шучу, очевидно -delete
вызывает unlinkat ()
, поэтому он ведет себя как unlink
или rmdir
и отказывается работать с каталогами, содержащими файлы.
Для удаления каталога .svn уже есть много ответов. . Но я хочу добавить, что вы можете избежать этих каталогов с самого начала, если вы выполните экспорт вместо проверки:
svn export <url>
Если вам не нравится видеть много предупреждений
find: `./.svn': No such file or directory
, используйте -depth
переключатель:
find . -depth -name .svn -exec rm -fr {} \;
Вы почти получили это. Если вы хотите передать вывод одной команды в качестве параметров другой, вам нужно будет использовать xargs. Добавление -print0
гарантирует, что сценарий может обрабатывать пути с пробелами:
find . -type d -name .svn -print0|xargs -0 rm -rf
В 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\" \""
Попробуйте следующее:
find . -name .svn -exec rm -v {} \;
Подробнее о команде find см. developerWorks .
В качестве альтернативы, если вы хотите экспортировать копию без изменения рабочей копии, вы можете использовать rsync:
rsync -a --exclude .svn path/to/working/copy path/to/export