Uruchomiłem następujące polecenie, aby zastąpić termin używany we wszystkich plikach w bieżącym katalogu roboczym:
$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
Wykonało to zamianę słów, ale utworzyło także .bup
pliki, które nigdy nie miały Ms. Johnson
łańcucha.
Jak wykonać podstawienie bez tworzenia wszystkich tych niepotrzebnych kopii zapasowych?
linux
shell-script
scripting
sed
Belmin Fernandez
źródło
źródło
ex
i warunkowo (tylko w przypadku zmiany pliku) uruchomione:!cp '%' '%.bup'
przed zapisaniem i wyjściem. Może warto się przyjrzeć.vi
wymianie stosu.Odpowiedzi:
Możesz sprawdzić zawartość plików, aby upewnić się, że nastąpi zamiana, gdy
sed
na nich zadziała :Jeśli chcesz być naprawdę mądry, możesz w ogóle zrezygnować z
find
:źródło
'{}'
tylko przed\;
w tym-exec
.Znajdź ma
-exec
operatora, który wykonuje dowolne polecenie. Jeszcze lepiej-exec
jest testem , więc możesz-exec
połączyć kilka s razem, a jeśli wcześniejsze polecenia zawiodą, późniejsze nie zostaną wykonane. Ciąg{}
zostaje zastąpiony bieżącą nazwą pliku i;
oznacza koniec polecenia. Powinieneś podać oba, aby uniknąć zakłóceń powłoki.Więc:
źródło
{}
do łańcucha zerowego podczas rozwijania nawiasów klamrowych.Spojrzałem na stronę podręcznika i nie widziałem żadnego sposobu, aby to zrobić bezpośrednio
sed
, jak jestem pewien, że zrobiłeś to przed pytaniem. Widzę kilka sposobów obejścia tego za pomocą grep, ale myślę, że najłatwiej jest to:-r
recurse-l
drukuj nazwę pliku-Z
kończą tylko nazwy z nullźródło
Wygląda na to, że musisz najpierw utworzyć listę plików, które pasują do wyszukiwanych haseł.
źródło
.
jako pierwszego argumentufind
. Ponadto, jak poinformowano mnie nie tak dawno temu, tak naprawdę nie musisz cytować ani uciekać{}
find
generuje listę plików oddzieloną znakiem nowej linii, następnie powłoka dzieli tę listę w dowolnym miejscu spacji (nie tylko nowej linii), a następnie powłoka traktuje każde słowo jako wzorzec globalny. Działa to tylko wtedy, gdy nazwy plików nie zawierają białych znaków lub\[?*
. Inne odpowiedzi na tej stronie pokazują, jak to zrobić poprawnie..
Jest niepotrzebny z find (przynajmniej find znaleziony na Linuksie), ponieważ zakłada się, że nie podano argumentu ścieżce.