2009-07-30 12 views
23

Kiedy użyć polecenia:Używanie grep do wyszukiwania plików dostarczanych przez find: co jest nie tak z find. | xargs grep "..."?

find . | xargs grep '...' 

mam złe wyniki. Próbuję wyszukać ciąg ... we wszystkich plikach w bieżącym folderze.

+3

masz więcej przykładów? –

+4

następnie najpierw musisz nauczyć się poprawnie zadawać pytanie. technicznie, nie ma w tym nic złego. pytanie brzmi, co chcesz zrobić. opisać to poprawnie i wyraźnie – ghostdog74

+0

masz na myśli, co mam jako odpowiedź? – cupakob

Odpowiedz

37

Jak Andy White powiedział, trzeba użyć fgrep w celu dopasowania do zwykłego . lub ucieczki kropki.

Więc trzeba pisać (-type f jest tylko pliki: Ci oczywiście nie chcą katalogi.):

find . -type f | xargs fgrep '...' 

lub jeśli nadal chcesz używać grep:

find . -type f | xargs grep '\.\.\.' 

a jeśli chcesz tylko aktualny katalogu a nie jego subdirs:

find . -maxdepth 1 -type f | xargs fgrep '...' 
+2

'grep -F '...'' powinno działać równie dobrze – Hasturkun

+2

@Hasturkun: Tak. Po prostu mam tendencję do preferowania różnych nazw poleceń niż dodatkowe opcje (np. Używanie 'gunzip' zamiast' gzip -d'). Tylko kwestia gustu zwykle. –

2

Jeśli piszesz dosłownie grep '...', dopasujesz prawie dowolny ciąg. Wątpię, czy faktycznie wpisujesz '...' dla polecenia grep, ale jeśli tak, to ... będzie pasować do dowolnych trzech znaków.

Podaj więcej informacji o tym, czego szukasz, a może ktoś może pomóc Ci uzyskać więcej.

1

Jeśli szukasz pliku, który pasuje, spróbuj:

find . -name "filename pattern" 

lub

find . | grep "filename pattern" 

Jeśli szukasz szuka plików tego meczu (czyli zawiera grep string)

find . | xargs grep "string pattern" 

działa dobrze. lub po prostu:

grep "string pattern" -R * 
+0

Tak, szukam plików zawierających ciąg "...", ale: 1. Znajdź. | xargs grep "ciąg wzór" lub 2. grep "ciąg wzór" -R * nie pomaga. – cupakob

7

"." dopasowuje dowolny znak, dzięki czemu znajdziesz wszystkie wiersze zawierające 3 lub więcej znaków.

Można też uciec kropki, na przykład:

find . | xargs grep '\.\.\.' 

Albo można użyć fgrep, który robi dosłowne mecz zamiast meczu regex:

find . | xargs fgrep '...' 

(niektóre wersje grep zaakceptuj również flagę -F, która sprawia, że ​​zachowują się jak fgrep.)

-1

Aby zakończyć odpowiedź Jeremy'ego, można również spróbować

find . -type f | xargs grep 'your_pattern' 

lub

find . -type f -exec grep 'your_pattern' {} + 

który jest podobny do xargs

dodam: RTFM! Lub w bardziej grzeczny sposób: użyj & nadużycie przez:

man command 
!

+1

Więcej uprzejmy? Przeczytaj przyjazną instrukcję? Jak można to uznać za niegrzeczne? Grzeczny dziwoląg. :) –

+0

Strony man są rzeczywiście całkiem przyjazne i nie mogą się doczekać ponownego przeczytania. (Zrobiłeś mój dzień, Jeremy XD) –

+0

Im później to się stanie, tym bardziej niepokoją moje komentarze. Myślę, że teraz osiągam szczyt. To wszystko znika stąd. –

5

@OP, jeśli szukasz plików, które zawierają ...

grep -R "\.\.\." * 
+1

Zdecydowanie najprostsze rozwiązanie. grep ma wbudowane przeszukiwanie plików rekurencyjnych. – duckbrain