it-swarm.com.de

Wie kann ein Dateiname anstelle des Inhalts einer Datei "grep" werden?

grep wird verwendet, um in einer Datei zu suchen, ob eine Zeile mit einem bestimmten regulären Ausdruck übereinstimmt. Ich habe jedoch diese Situation - ich möchte einen regulären Ausdruck schreiben, der mit dem Dateinamen (und nicht dem Inhalt der Datei) übereinstimmt. Ich werde dies vom Stammverzeichnis des Systems aus ausführen, um alle Dateien zu finden, die dem regulären Ausdruck entsprechen. 

Wenn ich beispielsweise alle VB - Formulardateien finden möchte, die mit einem "f" beginnen und mit .frm enden, verwende ich den regulären Ausdruck 

   "f[[:alnum:]]*\.frm"

Kann grep das tun? Wenn nicht, gibt es ein Dienstprogramm, mit dem ich das tun könnte? Vielen Dank. 

114
CodeBlue

In diesem Fall müssen Sie find anstelle von grep verwenden.

Sie können auch find in Kombination mit grep oder egrep verwenden:

$ find | grep "f[[:alnum:]]\.frm"
102

Wie Pablo sagte, müssen Sie find anstelle von grep verwenden, aber es ist nicht erforderlich, find an grep zu übergeben. find hat diese Funktionalität eingebaut:

find . -regex 'f[[:alnum:]]\.frm'

find ist ein sehr leistungsfähiges Programm zum Suchen von Dateien nach Namen. Es unterstützt die Suche nach Dateityp und die Einschränkung der Tiefe, die Kombination verschiedener Suchbegriffe mit booleschen Operationen und die Ausführung beliebiger Befehle für gefundene Dateien. Siehe die Find-Manpage für weitere Informationen.

41
whereswalden

Beispiel

find <path> -name *FileName*

Vom Handbuch:

Suchmuster

Die Basis des Dateinamens (der Pfad, in dem die führenden Verzeichnisse entfernt wurden) stimmt mit dem Shell-Mustermuster .. überein. Da die führenden Verzeichnisse entfernt werden, enthalten die Dateinamen, die für eine Übereinstimmung mit -name berücksichtigt werden, niemals. name a/b "wird nie mit irgendetwas übereinstimmen (wahrscheinlich müssen Sie stattdessen -path verwenden). Die Metazeichen ("*", "?" Und "[]") stimmen mit einem "." am Anfang des Basisnamens (dies ist eine Änderung in find ‐ utils-4.2.2; siehe Abschnitt NORMENKONFORMANCE unten). Um ein Verzeichnis und die darin enthaltenen Dateien zu ignorieren, verwenden Sie Use -Prune; Ein Beispiel finden Sie in der Beschreibung von -path. Zahnspangen werden nicht als etwas Besonderes erkannt, ..., obwohl einige Shells, einschließlich Bash, Zahnspangen mit einer speziellen Bedeutung in Shell-Mustern enthalten. Der Dateinamensabgleich wird mit der Bibliotheksfunktion fnmatch (3) durchgeführt. Vergessen Sie nicht, das Muster in Anführungszeichen zu setzen, um es vor der Erweiterung durch die Shell zu schützen.

27
javaPlease42
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

typ_deskriptor Typen: -

f: reguläre Datei

d: Verzeichnis

l: symbolischer Link

c: Zeichengeräte

b: Geräte blockieren

11

Sie können den vollständigen Pfad einer Datei mithilfe von grep finden, indem Sie nur die Ausgabe der Baumstruktur weiterleiten

tree -f | grep filename

Hier ist eine Funktion, die Sie in Ihr .bash_profile oder .bashrc einfügen können

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path
11
jasonleonhard

Sie können auch tun:

tree | grep filename

Dadurch wird die Ausgabe des Tree-Befehls für eine Suche an grep weitergeleitet. Dadurch erfahren Sie nur, ob die Datei existiert.

5
caylus

Nein, grep funktioniert gut dafür:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"
0
R M

Auch für mehrere Dateien.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"
0
DimiDak