2011-11-21 13 views
14

Jestem całkowicie nowy w Bash, ale po prostu nie mogę znaleźć sposobu, aby zrobić to, co chcę.BASH: program rekurencyjny zastępujący tekst w drzewie plików

Wyobraź sobie, że masz katalog drzewo z 2 plików: /top.php i /test/bottom.php

Jak zrobić mojej funkcji wygląd i zastąpić powiedzieć „cześć” do „bonjour” w/górze .php AND w /test/bottom.php?

Do tej pory jedynym sposobem znalazłem to zrobić wywołując tę ​​samą funkcję dwukrotnie innym poziomie Głębokość:

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

pewno nie jest rekurencyjny sposób to zrobić w jednym wierszu?

+0

możliwe duplikat [Awk/Sed: Jak zrobić rekursję ve znaleźć/zastąpić ciąg?] (http://stackoverflow.com/questions/1583219/awk-sed-how-to-a-recursive-find-replace-of-a-string) – Pureferret

Odpowiedz

36

Użyj rzeczywisty wzór na znalezienie zamiast muszli wieloznacznym rozbudowa:

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

Twój pracował idealnie ! Zrobiłbym to, gdybym mógł, ale nie mam wymaganej ilości reputacji. – Audioy

+1

@Erken: Dzięki. Powinieneś mieć reputację, aby zaakceptować odpowiedź (zaznaczenie poniżej liczby głosów). Jaka jest poprawna odpowiedź, jeśli tak działa :-). – thiton

+0

Doskonale, rozumiem! Wielkie dzięki, niesamowicie szybko! oO – Audioy

-2

użytkowania xargs i grep:

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

Oto jak to działa:

Znajdź wszystkie pliki w-a -Nowy bieżący katalog:

find . -type f 

obejmować tylko te pliki z rozszerzeniem PHP:

grep php$ 

wziąć każdy wiersz i zastosowanie sed do niego:

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

z wyjątkiem tego, że nie działa (rozważ nazwy plików ze spacjami) – sehe

+0

Po pierwsze, nie umieszczaj spacji w nazwach plików! :) Po drugie, po prostu zacytuj-załącz fragment "{}" i powinieneś być w porządku. –

+3

Nie. Grep/xargs zabije twoje kocięta. – sehe

2

zamknij

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

Albo

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

Pierwsze podane rozwiązanie nie działa.Nie próbowałem drugiej, ale rozwiązanie podane przez thitona było prostsze: – Audioy

+0

@Erken: to dlatego, że masz więcej plików w górnym katalogu niż opisywane pytanie. Naucz się zacytować swoje symbole wieloznaczne, jeśli nie chcesz, aby zostały rozwinięte. – sehe

+0

Mam cię! Dziękuję sehe – Audioy

Powiązane problemy