2009-12-12 1 views
7

Gibt es eine Möglichkeit, grep verwenden könnten einige Dateien zu ignorieren, wenn etwas, etwas Gleichwertiges Suche nach svnignore oder gitignore? Normalerweise benutze ich so etwas, wenn ich Quellcode suche., wie man automatisch zu ignorieren Dateien in grep

grep -r something * | grep -v ignore_file1 | grep -v ignore_file2 

Selbst wenn ich einen Alias ​​einrichten könnte, um diese Dateien zu ignorieren, wäre grep gut.

+0

einige Alias ​​und Funktion Derivate ausprobiert, endete mit der auf up e Liner habe ich unten gepostet. Großartige Idee! Dies ist eine neue Ergänzung für meine Shell! – zen

+0

Sie können auch die GLOBIGNORE-Variable von bash auschecken. Dadurch kann die Shell die Bedeutung von '*' verfeinern. Hilft dir natürlich nicht mit grep -r, aber es ist eine praktische Sache in deiner Toolbox. –

Antwort

8

--exclude Option auf grep wird auch funktionieren:

grep perl * --exclude=try* --exclude=tk* 

Dies sucht nach perl in Dateien im aktuellen Verzeichnis Ausschließen von Dateien mit try beginnen oder tk

+0

diese Art von hilft meine Notwendigkeit, --exclude und --exclude-dir – rampr

+0

Das ist im Grunde, was ich tue - außer ich verwandle das in ein Skript in meinem bin-Verzeichnis, so gibt es fast keine Eingabe. – khedron

+0

Ich habe einen Alias ​​für Grep mit --exclude und exclude-dir und viele andere Optionen mit Farben erstellt, macht meine grep jetzt einfacher – rampr

1
find . -path ./ignore -prune -o -exec grep -r something {} \; 

Was das bedeutet ist, alle Dateien im aktuellen Verzeichnis ohne das Verzeichnis finden (oder Datei) mit dem Namen „ignorieren“, führt dann den Befehl grep -r etwas auf jeder Datei in den nicht-ignorierten Dateien gefunden.

0

ich denke grep nicht Dateinamen Filterung hat. Um das zu erreichen, was Sie zu tun versuchen, können Sie kombinieren finden, xargs und grep Befehle. Mein Gedächtnis ist nicht gut, so dass das Beispiel nicht funktionieren könnte:

find -name "foo" | xargs grep "pattern" 

Suche flexibel ist, können Sie Platzhalter verwenden, ignorieren Fall oder regulären Ausdrücke verwenden. Sie können Handbuchseiten für vollständige Beschreibung lesen.

nächsten Beitrag zu lesen, tut scheinbar grep Dateiname Filterung haben.

2

Vielleicht wollen Sie auch einen Blick nehmen bei ack, die neben vielen anderen Funktionen, die standardmäßig nicht durchsucht VCS Verzeichnisse wie Svn und .git.

0

Hier ist eine minimalistische Version von .gitignore. Erfordert Standard-utils: awk, sed (weil mein awk so lahm ist), egrep:

cat > ~/bin/grepignore #or anywhere you like in your $PATH 
egrep -v "`awk '1' ORS=\| .grepignore | sed -e 's/|$//g' ; echo`" 
^D 
chmod 755 ~/bin/grepignore 
cat >> ./.grepignore #above set to look in cwd 
ignorefile_1 
... 
^D 
grep -r something * | grepignore 

grepignore baut eine einfache Wechsel-Klausel:

egrep -v ignorefile_one|ignorefile_two 

nicht unglaublich effizient, aber gut für den manuellen Gebrauch

1

Verwendung shell Expansions

shopt -s extglob 
for file in !(file1_ignore|file2_ignore) 
do 
    grep ..... "$file" 
done