2011-11-21 17 views
14

Soy completamente nuevo en Bash, pero parece que no puedo encontrar la manera de hacerlo funcionar.BASH: programa recursivo para reemplazar texto en un árbol de archivos

Imagine que tiene un árbol de directorios con 2 archivos: /top.php y /test/bottom.php

¿Cómo puedo hacer mi mirada función y reemplazar decir "hola" en "Bonjour" en/top .php AND en /test/bottom.php?

Hasta ahora la única manera que he encontrado para hacer esto es llamando a la misma función dos veces con un nivel de profundidad diferente:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 

Seguramente hay una manera recursiva para hacer esto en una línea?

+0

posible duplicado de [Awk/Sed: Cómo hacer un recursi ve buscar/reemplazar una cadena?] (http://stackoverflow.com/questions/1583219/awk-sed-how-to-do-a-recursive-find-replace-of-a-string) – Pureferret

Respuesta

36

Utilice un patrón real de encontrar en lugar de cabeza de expansión de comodines:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 
+0

Tuyo trabajó perfecto ! Ya lo hubiera votado si pudiera, pero aún no tengo la reputación requerida – Audioy

+1

@Erken: gracias. Debería tener la reputación de aceptar la respuesta (la marca de verificación debajo del número de votos). Cuál es la respuesta correcta si funciona, de todos modos :-). – thiton

+0

Perfecto, lo tengo! Muchas gracias, chicos, ¡han sido increíblemente rápidos! oO – Audioy

-2

Use xargs y grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {} 

Así es como funciona:

encontrar todos los archivos de entrada y -bajo directorio actual:

find . -type f 

Incluir sólo aquellos archivos que terminan en php:

grep php$ 

Tome cada línea y aplicar sed para que:

xargs -n1 -i sed -i 's/hello/bonjour/' {} 
+2

excepto que no funciona (considere los nombres de archivo con espacios) – sehe

+0

¡Antes que nada, no ponga espacios en sus nombres de archivo! :) En segundo lugar, simplemente cite: encierre la porción "{}" y debería estar bien. –

+3

No. Grep/xargs matará a tus gatitos. – sehe

2

Cerca:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 

O

find -iname '*.php' -type f -print0 | 
    xargs -0 sed -i 's/hello/bonjour/' 
+0

la primera solución que diste no funcionó.No he probado el segundo, pero la solución dada por thiton fue más directa – Audioy

+0

@Erken: eso se debe a que tenía más archivos en el directorio superior que la pregunta descrita. Aprenda a citar sus comodines si no los quiere expandir. – sehe

+0

¡Entendido! Gracias sehe – Audioy

Cuestiones relacionadas