Jeg bruker følgende kommando på min mac:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
og det ser ut til å ikke ha noen effekt.
Jeg har to filer i katalogen som ender på .java, som begge har foo tekst i dem. Mangler jeg noe?
EDIT: Resultater fra forespørsel om kommentarer
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i "s/foo/bar/g" {} \; sed: 1: "./bar.java": invalid command code . sed: 1: "./foo.java": invalid command code .
Kommentarer
Svar
Først og fremst må du sørge for at du bruker vanlig ascii sitater som "
og "
(ascii-koder 0x22
og 0x27
, henholdsvis) i skallskript, fordi eksemplet i innlegget ditt inneholder ikke-standardiserte anførselstegn. Hvis du ser nøye ut, ser de litt annerledes ut. Sannsynligvis er dette en kopi-lim-feil fra et rikt tekstdokument format som Word, OOWriter eller til og med et nettleservindu.
Siden du er på en Mac, har du sannsynligvis FreeBSD-implementeringen av sed
, der tilfelle må du skrive kommandoen på denne måten:
find . -name "*.java" -exec sed -i "" s/foo/bar/g {} +
(her bruker du +
i stedet for \;
for å unngå å kjøre en sed
påkallelse per fil).
I FreeBSD-implementeringen av sed
-flagget trenger et argument: utvidelsen av en sikkerhetskopifil. For eksempel med -i .bak
vil kommandoen sikkerhetskopiere file1.txt
som file1.txt.bak
først før du utfører erstatningen i originalfilen. Å bruke et tomt argument ""
betyr å ikke bruke en sikkerhetskopifil, som ser ut til å være det du vil ha.
Det samme i GNU (eller NetBSD, OpenBSD , busybox) implementering vil være:
find . -name "*.java" -exec sed -i s/foo/bar/g {} +
Takk @bahamat og @Mikel og @ pieter-breed for å forbedre svaret mitt med dine kommentarer.
Kommentarer
- Hva gjør de krøllete bukkene?
- @ZaneHitchcox de krøllete bukkene er plassholdere for det samsvarte filnavnet
- hva ' er
+
på slutten? - @Anthony
+
på slutten avslutter listen over argumenter for alternativet-exec
. Det kreves av syntaksen til-exec
.
-exec
og alt etter det? Skriver det ut navnene på Java-filene? (Jeg ' er bekymret at du ' bruker smarte anførselstegn i stedet for ASCII-anførselstegn.)"
og'
.