Linux grep oder Verwendung finden

2463
Peter Mortensen

Wie finde ich eine Datei auf meiner Festplatte, die mit beginnt io_file?

Ich habe es versucht:

grep -r io_file*` 

und

find -name io_file* 

findgab nichts zurück, grepscheint jedoch ohne Ergebnis zu dauern.

Was mache ich falsch?

4
grep und find sind nicht für dasselbe gedacht. vor 15 Jahren 1
(nicht dasselbe Tom wie das Poster) vor 15 Jahren 1
Mit allem gebührenden Respekt für die in den anderen Antworten gezeigten echten Such-Zauber kann alternativ auch [ack] (http://betterthangrep.com/) installiert werden. Dies ist ein Perl-Tool, das über eine einfachere Benutzeroberfläche verfügt und die wichtigsten Funktionen von find und grep umfasst. Yuval F vor 15 Jahren 0

8 Antworten auf die Frage

11
John Millikin

find / -name 'io_file*'

Der erste Parameter gibt an, wo die Suche beginnen soll. /bedeutet Ihre gesamte Festplatte. Um nur im aktuellen Verzeichnis (und den Unterverzeichnissen) zu suchen, verwenden Sie:find .

Die Suchzeichenfolge muss in Anführungszeichen gesetzt werden, wenn sie ein Shell-Metazeichen enthält, z. B. ein Sternchen. Andernfalls wird es von der Shell analysiert und von nie gesehen find.

Nicht ganz richtig. Die Suchzeichenfolge wird nur erweitert **, wenn eine Übereinstimmung besteht **, andernfalls wird sie nicht erweitert. Versuchen Sie beispielsweise "echo thisisnotafile *". JesperE vor 15 Jahren 1
Jesper: Ist das Shell-abhängiges Verhalten? Das Terminal, von dem aus ich arbeite, verwendet 'tcsh', und das Zitieren macht einen Unterschied, selbst wenn es sich um Dateinamen handelt, die nicht erweiterbar sind. vor 15 Jahren 1
Dank dafür. Und wie kann ich sagen, dass ich im aktuellen Verzeichnis WIE WIE alle Unterverzeichnisse suchen möchte? vor 15 Jahren 0
Ändern Sie einfach das "/" für "." (ohne Anführungszeichen) (Wieder nicht das Plakat) vor 15 Jahren 0
@ John Millikin: In der Tat verhalten sich bash und tcsh anders. Bastien Léonard vor 15 Jahren 0
7
Tom
find / -name 'io_file*' -type f 2>/dev/null    /: Start looking from root directory  -type f: Only search for regular files  2>/dev/null: Redirect errors to /dev/null. (handy if you are not root and not interested in all the "access denied" messages) 

Denken Sie daran, dass grep und finden Sie verschiedene Dinge.

grep durchsucht die benannten Eingabedateien (oder die Standardeingabe, wenn keine Dateien benannt werden oder der Dateiname - wird angegeben) nach Zeilen, die eine Übereinstimmung mit dem angegebenen PATTERN enthalten. Standardmäßig druckt grep die übereinstimmenden Zeilen.

find - Suche nach Dateien in einer Verzeichnishierarchie

-name pattern Vergessen Sie nicht, das Muster in Anführungszeichen zu setzen, um es vor der Erweiterung durch die Shell zu schützen. vor 15 Jahren 0
das ist von der find man Seite vor 15 Jahren 0
@jcolebrand Nö Tom vor 13 Jahren 0
4
LiraNuna

IMO, die Verwendung von find ist für eine vollständige Suche nach Festplatten langsam (es werden Ihnen auch viele Berechtigungsfehler angezeigt, wenn Sie auf Dateien zugreifen, die Sie nicht besitzen). Verwenden Sie nach Möglichkeit locate:

locate -b 'io_file*' 

Sie müssen wahrscheinlich erneut indizieren, wenn die Datei neuer als 24 Stunden ist (normalerweise wird ein täglicher Cronjob festgelegt):

sudo updatedb 
2
Gavin H
find / -name 'io_file*' 
2
Peter Mortensen

Der Befehl

# set -x 

druckt nach der Shell-Erweiterung Befehle, damit Sie sehen können, was los ist

# find . -name letter.* + find . -name letter.rtf 

... und jetzt können Sie sehen, dass die Shell das Argument erweitert, in dem sie benannt werden kann letter.rtf, da mein aktuelles Verzeichnis eine Datei enthält letter.rtf, die dem Muster entspricht.

Wenn Sie das Muster in Anführungszeichen setzen (doppelte Anführungszeichen funktionieren auch in diesem Fall), wird die Shell-Erweiterung gestoppt

# find . -name 'letter.*' + find . -name 'letter.*' 

Um es auszuschalten, verwenden Sie

# set +x 

Sie können auch -xin einer Shebang-Zeile verwenden, um zu sehen, welche Shell-Skripts das Debuggen erheblich unterstützen.

#!/bin/bash -x 
0
Graeme Perrow

Die Shell erweitert die Platzhalterzeichen und übergibt das Ergebnis an grep. Sie müssen entweder die Escapezeichen verwenden *oder Anführungszeichen verwenden:

find / -name io_file\* find / -name 'io_file*' find / -name "io_file*" 

Alle drei davon machen auf meiner Linux-Box dasselbe.

0
JesperE

find -name io_file*sucht nur im aktuellen Verzeichnis und darunter. Wenn Sie die gesamte Festplatte durchsuchen möchten, müssen Sie den Pfad angeben: find / -name io_file*. Gleiches gilt für grep -r; Es wird nur im aktuellen Verzeichnis und darunter gesucht.

Das findDienstprogramm ist sehr praktisch, kann aber etwas uninteressant sein. Meine Empfehlung ist, dass Sie die find-Man-Page ( man find) lesen, es lohnt sich die investierte Zeit.

0
sgm

Da Sie grep keine Datei gegeben haben, arbeitet es mit der Standardeingabe und wartet darauf, dass Sie etwas eingeben. Es ist sowieso der falsche Befehl. Für find benötigen Sie ein Verzeichnis und müssen io_file*Anführungszeichen setzen. Andernfalls wird es von der Shell erweitert:

find / -name "io_file*" 

Sie können auch verwenden, locate "io_file*"was schneller ist, aber ungenau sein kann.