Jeśli dobrze cię rozumiem, to właśnie chcesz zrobić:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
wszystkie pliki z rozszerzeniem py
, grep
tylko wiersze zawierające something
i zapisujące wiersze output.txt
. Jeśli plik zawiera coś, zostanie zastąpiony.
Edytuj: Używając -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Zamieszczam tutaj komentarz Chrisa Downsa. Powyższe polecenie spowoduje grep
wykonanie tyle razy, ile razy wystąpi find
. Jednak jeśli zamienisz na ;
a +
, grep
zostanie wywołany z wyjściem z find
konkatenacji (do pewnego limitu). Zobacz pytanie Używanie średnika (;) vs plus (+) z exec w celu znalezienia dodatkowych informacji na ten temat.
+
zamiast\;
, znacznie skróci czas wykonywania (ponieważ będzie zawierał argumenty przed wykonaniem doARG_MAX
).grep -H
jeśli chcesz dołączyć nazwę pliku do wyniku.Jeśli chcesz zapisać wszystkie pasujące linie we wszystkich plikach
output.txt
, twoje ostatnie polecenie działa, z wyjątkiem tego, że brakuje wymaganego;
na końcu polecenia.Jeśli chcesz, aby każde uruchomienie
grep
generowało dane wyjściowe do innego pliku, uruchom powłokę, aby obliczyć nazwę pliku wyjściowego i wykonać przekierowanie.źródło
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
A jeśli chcesz zobaczyć numery linii grep'ed, możesz oczywiście użyćgrep -n "something"
Dla przypomnienia,
grep
ma--include
i--exclude
argumenty, które można wykorzystać do filtrowania plików przeszukuje:źródło
grep
robi.Użyj
tee
:Zastrzeżenie, to jeśli masz żadnych plików ze znakami specjalnymi (łącznie ze spacjami), które
xargs
igrep
nie będą dobrze pracować (a file.txt
będą interpretowane jako dwa pliki,a
afile.txt
). Alternatywą jest użycie albo-x
Or-print0
, ale żadnej z tych będzie zanieczyścićoutput.txt
.-x
Użyje\
do ucieczki niektórych znaków specjalnych i to będzieoutput.txt
.-print0
Użyje zerowy bajt jako separatora pól (co wymaga równieżxargs -0
) ioutput.txt
będzie wyglądać jak jeden długi ciągłej linii tekstu.To, jak sobie z tym poradzisz (lub nie), zależy od ciebie.
źródło