2011-01-11 9 views
5

¿Cómo buscar y reemplazar todas las apariciones de:¿Cómo realizo un descubrimiento recursivo y reemplazo dentro de un checkout de SVN?

foo 

con

bar 

en cada archivo de texto en el directorio/mi/test/dir/árbol de directorios (búsqueda recursiva/reemplazar).

pero quiero ser capaz de hacerlo de manera segura dentro de un checkout de SVN y no tocar nada dentro de los directorios .svn

similares a esta, pero ahora con la restricción SVN: Awk/Sed: How to do a recursive find/replace of a string?

Respuesta

10

Hay varias posibilidades:

Utilización de la búsqueda:

Utilización de la búsqueda para crear una lista de todos los archivos, y luego a llevarlas por sed o el correo quivalente, como se sugiere en la respuesta a la que hace referencia, es bastante sencillo y solo requiere escanear los archivos una vez.

Utilizaría una de las mismas respuestas que las de la pregunta que mencionó, pero agregando -path '*/.svn' -prune -o después del find . para eliminar los directorios SVN. Vea this question para una discusión sobre el uso de la opción prune con find, aunque tenga en cuenta que tienen el patrón equivocado. Por lo tanto, para imprimir todos los archivos, se debería utilizar:

find . -path '*/.svn' -prune -o -type f -print 

A continuación, se puede canalizar de que en una llamada o xargs que ver las sustituciones individuales, como se sugiere en la pregunta que se hace referencia. Hay mucha discusión sobre las diferentes opciones que hay, que no voy a reproducir aquí, aunque yo prefiero la versión de John Zwinck's answer:

find . -path '*/.svn' -prune -o -type f -exec sed -i 's/foo/bar/g' {} + 

El uso de grep recursivo:

Si tiene un sistema con GNU grep, puede usar eso para encontrar la lista de archivos también. Esta es probablemente menos eficiente que encontrar, pero sí permite que sólo se permite llamar sed sobre los archivos que coinciden, y yo personalmente encontrar la sintaxis mucho más fácil de recordar (o la figura hacia fuera de las páginas de manual):

sed -i 's/foo/bar/g' `grep -l -R --exclude-dir='*/.svn' 'foo' .` 

El La opción -l hace que grep solo muestre la lista de nombres de archivo, en lugar de las líneas correspondientes.

Con un editor de interfaz gráfica de usuario:

Alternativamente, si usted está utilizando ventanas, hacer lo que hago - obtener una copia del editor Notetab (disponible en una versión gratuita), y utilizar su Buscar- and-replace-on-disk, que ignora automáticamente los directorios .svn ocultos y simplemente funciona.

Editar: corregido patrón hallazgo a */.svn en lugar de .svn, añade más detalles y algunas otras posibilidades. Sin embargo, esto depende de su plataforma y la versión svn: .svn sin */ puede ser necesario en algunos casos, como en CentOS 7.

+0

Creo que estás diciendo que hagas esto: encontrar. -path '.svn' -prune -o -type f -print Pero eso no parece funcionar. –

+0

Eso es lo que estaba diciendo que hicieras, y tienes razón, no funciona. Creo que ya descubrí por qué, y corregiré para corregir. –

+0

Cuando hago el grep recursivo en CentOS 7, sigo recibiendo directorios .svn. Si en su lugar pongo '--exclude-dir = '. Svn'' se van. – Kev

0

¿Qué tal esto?

grep -i "search_string" `find "*.some_extension"` 

Esa es la solución a medio camino de la búsqueda de una search_string dentro de los archivos que tienen una extensión específica .... una vez que conozca los archivos que tiene la cadena, puede ser fácilmente modificado mediante la canalización en sed ....

+0

Parece una forma muy complicada de 'grep -R -i" search_string "', y en cualquier caso, debe agregar algo para excluir los directorios SVN. –

+0

@Brooks: es una versión más portátil para usar, ya que no todo grep tiene un interruptor recursivo .... – t0mm13b

Cuestiones relacionadas