3 Stimmen

Wie schreibe ich einen Bash-Alias/Funktion, um alle Dateien in allen Unterverzeichnissen nach einer Zeichenfolge zu durchsuchen?

Ich habe den folgenden Befehl verwendet, um nach einer Zeichenkette in allen Python-Quelldateien in und unter meinem aktuellen Verzeichnis zu suchen:

find . -name '*.py' -exec grep -nHr <string> {} \;

Ich würde die Dinge gerne vereinfachen, so dass ich einfach etwas eingeben kann wie

findpy <string>

Und erhalten genau das gleiche Ergebnis. Aliase scheinen nicht ausreichend, da sie nur eine Zeichenfolgenexpansion tun, und das Argument, das ich angeben muss, ist nicht das letzte Argument. Es klingt wie Funktionen sind für die Aufgabe geeignet, so habe ich mehrere Fragen:

  • Wie schreibe ich ihn?
  • Wo soll ich es hinstellen?

1voto

paxdiablo Punkte 809679

Das Drehbuch:

#!/bin/bash
find . -name '*.py' -exec grep -nHr "$1" {} ';'

so würde ich es machen.

Sie schreiben es mit einem Editor wie vim und lege sie irgendwo auf deinen Weg. Mein normaler Ansatz ist es, eine ~/bin Verzeichnis und stellen Sie sicher, dass meine .profile Datei (oder gleichwertig) enthält:

PATH=$PATH:~/bin

0 Stimmen

Ich glaube nicht, dass Sie das -r bei Ihrem grep brauchen ;-)

1voto

Harold Bamford Punkte 1559

Viele Versionen von grep haben Optionen zur Rekursion, zur Angabe von Dateinamensmustern usw.

grep --perl-regexp --recursive --include='*.py' --regexp="$1" .

Dies rekurriert ausgehend vom aktuellen Verzeichnis (.), sucht nur nach Dateien, die auf 'py' enden, und verwendet reguläre Ausdrücke im Perl-Stil.

Wenn Ihre Version von grep die Optionen --recursive und --include nicht unterstützt, können Sie trotzdem find und xargs verwenden, aber stellen Sie sicher, dass Sie Pfadnamen mit eingebetteten Leerzeichen berücksichtigen, indem Sie das Argument -print0 für find und die Option --null für xargs verwenden, um dies zu berücksichtigen.

find . -type f -name '*.py' -print0 | xargs --null grep "$1"

sollte funktionieren.

0 Stimmen

Auf meinem System ist find schneller als grep --recursive. Außerdem gibt grep --recursive unter bestimmten Umständen "rekursive Verzeichnisschleife"-Fehler zurück, während find dies nicht tut.

0 Stimmen

Interessant! Die "rekursive Verzeichnisschleife" ist mir noch nie untergekommen, da ich normalerweise auf einem Windows-Rechner arbeite, der keine echten symbolischen Links hat. Ich nehme an, dass Sie diese Fehlermeldung so bekommen haben?

1voto

Jinyu Punkte 139

Fügen Sie die folgende Zeile in Ihre ~/.bashrc oder ~/.bash_profile oder ~/.profile ein

alias findpy='find . -type f -name "*.py" -print0 | xargs -0 grep'

dann können Sie sie wie folgt verwenden

findpy def

oder mit grep-Optionen

findpy -i class

der folgende Alias ignoriert das Versionskontroll-Meta-Verzeichnis von git und svn

alias findpy='find . -type f -not -path "*/.git/*" -a -not -path "*/.svn/*" -name "*.py" -print0 | xargs -0 grep'

0voto

#######################################################################################
#
# Function to search all files (including sub-directories) that match a given file
# extension ($2) looking for an indicated string ($1) - in a case insensitive manner.
#
# For Example:
#
# -> findfile AllowNegativePayments cpp
#
#
#######################################################################################
findfile ()
{
    find . -iname "*.$2*" -type f -print0 | xargs -0 grep -i "$1" {} \; 2> /dev/nul
}

alias _ff='findfile'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X