Kiedyś miałem wersję grep na moim komputerze (myślę, że pochodziła z wczesną wersją Delphi), która wspierała wyszukiwanie w zagnieżdżonych folderach za pomocą -r
przełącznik. Teraz coś (podejrzewam, że późniejsza wersja Delphi) przejęło starą grep i zastąpiło ją czymś, co ogłasza się tak:
C:\PROJECTS\>grep --version
grep (GNU grep) 2.4.2
Copyright 1988, 1992-1999, 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
udostępnia te opcje rekursji:
-d, --directories=ACTION how to handle directories
ACTION is 'read', 'recurse', or 'skip'.
-r, --recursive equivalent to --directories=recurse.
ale nie mogę przywrócić wyników z plików w folderach, więc grep -r fred *.txt
znajdzie tylko pliki w bieżącym folderze zawierające „fred”, a pliki w podfolderach są ignorowane.
Jaka jest tu wymagana magiczna opcja?
ODPOWIEDŹ z Rich Homolka jest poniżej, ale oto moje opakowanie partii opracowane na podstawie tej odpowiedzi:
:==========================================================================
: GrepExt - searches files matching an extension recursively for a string
:
: Usage : call GrepExt <regex string to search for> <extension>
: Example : call GrepExt "procedure\ *Add" pas
:
: Notes : - quotes only needed if regex contains spaces
: - remove the first "-i" for case-sensitive search
: - the second "-i" ensures the case of the extension doesn't matter
: - ErrorLevel set to 0 if there were any matches, 1 otherwise
: - this is very inefficient when the folders contain a large
: number of files that don't match the extension, as *all* files
: are grepped and the results are then grepped to filter out
: the hits from files that don't match the extension.
:
@echo off
grep -i -r "%~1" . | grep -i "^[^:]*\.%~2:"
sh
lub bash
, to *.txt
zostanie rozwinięty do listy wszystkich plików w katalogu roboczym zakończonym na .txt
, co wykluczałoby wszystkie katalogi. Próbowałeś umieścić *.txt
w pojedynczych cudzysłowach?
grep -r fred "*.txt"
daje mi *.txt: Invalid argument
- co oznacza, że prawdopodobnie mam kłopoty z wyszukiwaniem plików o nazwach z osadzonymi spacjami.