Der Find ist mächtig - Suchen und finden unter Linux

Dieser Artikel beschäftigt sich mit der Suche nach und in Dateien unter Linux.

Für die Suche unter Linux sind im wesentlichen 2 Befehle wichtig. Find und GrepFind findet die Dateien selbst. Grep durchsucht die Dateiinhalte. 

Find

Syntax: find [Verzeichnis] [-Option...] [-Test...] [-Aktion...]

Beschreibung:

Find durchsucht eine oder mehrere Verzeichnishirarchien nach Dateien mit bestimmten Eigenschaften.
Find arbeitet per Default rekursiv.

Optionen 

Optionen beziehen sich auf das Verhalten des Findbefehls und nicht auf die zu findenden Dateien

-daystart Setzt die Ausgangsberechnungszeit auf den Tagesanfang 0:00 Uhr  
-helpGibt eine kurze Hilfe aus.
-maxdepth nGibt die maximale Tiefe an, in der gesucht werden soll.
-mindepth nGibt die Mindesttiefe an, in der gesucht werden soll.

Tests 

Tests beziehen sich auf die Eigenschaften, die eine Datei haben muss, um gefunden zu werden.

Die bei Tests verwendeten numerischen Argumente werden auf die folgenden 3 Arten angegeben.
+N steht für alle Zahlen größer als N. Bsp +3 {4,5,6,7,8,9,10...}
- N steht für alle Zahlen kleiner als N. Bsp -10 {9,8,7,6,5,4...}
  N steht für genau die eine Zahl.

-amin, -atime, -anewer, -cmin, -ctime, -cnewer, -mmin, -mtime, -mnewer
Diese Tests werden nach einem bestimmten Schema aufgebaut das die folgende Tabelle verdeutlicht:

 min (Minuten)time (Tagen)newer (Referenzdatei) 
(a)ccessed -amin N-atime N-anewer
(c)hanged-cmin N-ctime N-cnewer
(m)odified -mmin N-mtime N-mnewer 

Dabei haben die Abkürzungen die folgenden Bedeutungen:

accessed: Entspricht dem lesenden Zugriff.
changed:Der Dateistatus wurde verändert. Dazu gehören alle Inode Informationen wie unter anderem der Name der Datei und die Rechte.
modified:Der Inhalt der Datei wurde verändert.
min:Der numerische Wert entspricht Minuten.
time:Der numerische Wert entspricht Tagen (N*24 Stunden).
newer:Die Zeitangabe wird an einer Referenzdatei festgemacht. Da hier eine Referenzdatei angegeben ist, wird kein numerischer Wert übergeben.

In diesem Zusammenhang muss die Option -Daystart noch erwähnt werden.  Es wird dann nicht von der aktuellen Zeit gerechnet, sondern von dem heutigen Tag in der Früh um 0:00 Uhr

Jetzt einige Beispiele:

find / -amin 5 Findet Dateien auf dem Rechner, auf die vor genau 5 Minuten lesend zugegriffen wurde.
find / -amin -5Findet Dateien auf dem Rechner, auf die vor {4,3,2,1,0} Minuten lesend zugegriffen wurde.
find / -amin +5Findet Dateien auf dem Rechner, auf die vor {6,7,8,9,10...} Minuten lesend zugegriffen wurde.
find / -cmin -5Findet Dateien, deren Dateistatus innerhalb der letzten 5 Minuten geändert wurde
find / -mmin +5Findet Dateien, deren Inhalt vor mehr als 5 Minuten verändert wurde.
find / -ctime +5Findet Dateien, deren Dateistatus vor mehr als 5 Tagen (5*24 Stunden) geändert wurde.
find / -mnewer /etc/fstabFindet Dateien, die vor weniger Zeit verändert wurden, als die Datei /etc/fstab. (Macht Sinn im Zusammenhang mit dem Test -name. So kann eine eventuell aktuellere Kopie einer Datei gefunden werden.)
 find / -daystart
-mtime -3
Findet Dateien, die von heute Früh (0:00 Uhr) gerechnet, vor weniger als 2*24 Stunden verändert wurden. Wenn also heute Montag wäre, alles was am Wochenende verändert wurde. 

Weiter genauer erläutert muss der Test -perm werden.

-perm findet Dateien oder Ordner, auf die eine bestimmte Rechtemaske zutrifft. Dabei kömmen 3 Modi angegeben werden. Modus ist dabei die dezimale Schreibweise (Bsp. 644) der entsprechenden Rechtemaske.

  • -perm Modus (Es werden Dateien gefunden, die exakt die angegebene Rechtemaske haben.)
  • -perm -Modus (Es werden Dateien gefunden, die mindestens die angegebenen Rechte haben.)
  • -perm +Modus (Es werden Dateien gefunden, die mindestens eins der angegebenen Rechte haben.)

Diese Angabe des Modus in der dezimalen Schreibweise führt sehr oft zu Verwirrung. Wer meint, der Test -perm -030 findet auch Dateien mit der Maske 040, liegt komplett daneben.
Man muss sich vor Augen führen, dass die dezimale Schreibweise der Rechtemaske lediglich eine andere Schreibweise für die Bitmaske ist, die "Bit für Bit" die einzelnen Rechte festlegt. Die bitweise Schreibweise ist die Einzige, welche für das Linuxsystem relevant ist, und daher auch die Einzige, welche für den Findbefehl herangezogen wird. Die dezimale Schreibweise ist lediglich eine Abstraktion der bitweisen Schreibweise und dient dazu, die Rechte für den Menschen leichter lesbar und merkbar zu machen. Die dezimale Schreibweise hat für die Funktion des Rechtesystems unter Linux absolut keine Bedeutung. Daher ist es auch falsch zu denken, -perm -030 würde 040 finden, weil 4 größer ist als 3 und die Bedingung mindestens 3 ist.

Hääää? Blicken wir durch die dezimale Schreibweise hindurch auf die dahinterliegende Bitmaske. Dann wird das Problem klarer.

User Group Others  
r(4)w(2)e(1)r(4)w(2)e(1)r(4)w(2)e(1) 
     x x   030
    x     040

Wenn nun nach einer Datei gesucht wird, die mindestens das Recht 030 hat, so meint das, dass User in der Gruppe des Besitzers in die Datei schreiben und sie ausführen dürfen. Inwieweit das ein sinnvolles und praxisnahes Recht ist, sei dahingestellt und ist für diese Erläuterung nicht wichtig. Das Recht 040 sagt aus, dass die Gruppe die Datei nur lesen darf. Sie darf weder in die Datei schreiben noch sie ausführen. Damit liegt es auf der Hand, warum -perm -030 (Gruppe darf mindestens schreiben und ausführen) eine Datei mit dem Recht 040 (Gruppe darf nur schreiben) nicht finden kann. Es fehlen also die 2 ursprünglichen Rechte und damit ist die Forderung "mindestens schreiben und ausführen" nicht mehr gegeben.

Genauso verhält es sich mit -perm +644, also wenn mindestens eins der Rechte gefordert ist.

User Group Others  
r(4)w(2)e(1)r(4)w(2)e(1)r(4)w(2)e(1) 
 x x  x   x  644
       x   x011
 x x    x   x611
 x x       600

Bei -perm +644 würden 611 und 600 gefunden werden. Logisch, denn gefordert ist ja mindestens eins der ursprünglichen Rechte und die Rechte r+w des Users sind ja darin enthalten. 011 dagegen würde nicht gefunden werden, da keins der Rechte User read and write, Group read oder Others read in 011 enthalten ist.

Alle weiteren Optionen sind mehr oder weniger einfach zu handhaben. Die Wichtigsten folgen in der nachstehenden Auflistung.

-gid N Datei gehört der Gruppe mit der Kennzahl N 
-group name Datei gehört der Guppe mit dem Namen name 
-links NDie Datei hat N harte Links 
-lname MusterDie Datei ist ein symbolischer Link auf eine weitere Datei oder ein Verzeichnis mit einem zum Muster passenden Namen
-name MusterDie Datei hat einen zum Muster passenden Namen  
-nouserDie Datei gehört keinem im System eingetragenen User 
-nogroupDie Datei gehört keiner im System eingetragenen Gruppe 
-regex MusterDer Pfadname passt auf den regulären Ausdruck Muster 
-size N[{c,k,M,G}] Die Datei überschreitet die angegebene Größe. Bytes(c), Kilobytes(k), Megabytes(M), Gigabytes(G)
-type c Die Datei entspricht dem Typ c. Es gibt Directory(d), Regular File(f), Symlink(l)
-uid N Die Kennziffer des Eigentümers ist N 
-used N Auf die Datei ist N Tage nach der letzten Änderung nicht mehr zugegriffen worden.  
-user Name

Die Datei gehört dem User Name 

Aktionen

-exec Kommando 

Übergibt die gefundenen Dateien an ein Kommando.
Bsp: find ~/ -name Test -exec rm {} \; 
Entfernt alle Dateien mit dem Namen Test aus dem eigenen Homeverzeichnis.

-ok Kommando Das Gleiche wie -exec nur mit Rückfrage
-print Gibt das Ergebnis auf dem Bildschirm aus. Zwischenzeitlich default, daher nur in älteren Systemen wichtig!
-ls Ausgabe des Ergebnissese im Format ls -dils 

Operatoren

Optionen Tests und Aktionen können auch mit Operatoren gruppiert werden.

(Ausdruck) Fasst mehrere Ausdrücke zusammen 
-o -orOder Verknüpfung 
-not Ausdruck oder  !Ausdruck   Negation 
 Ausdruck, Ausdruck2Liste, beide Ausdrücke werden bewertet 

Grep

Mit dem Befehl "grep" können Dateien nach bestimmten Inhalten durchsucht werden. Die Treffer werden dann zeilenweise ausgegeben.
Im Gegensatz zu find arbeitet grep per default nicht rekursiv.

Syntax: grep [-option] suchmuster [ Datei[ Datei2...]] 

Nachstehend eine Übersicht der wichtigsten Schalter.

-c Zeigt lediglich die Anzahl der Treffer an.
-f dateiDas Suchmuster wird aus einer Datei eingelesen
-i Ohne Unterscheidung von Groß- und Kleinschreibung 
-vNegation. Zeigt die Zeilen, welche das Suchmuster nicht enthalten. 
-EDer Suchstring soll per "extendet regular expression" egrep beurteilt werden 
-rSuche wird rekursiv durchgeführt 
--with-filenameDateiname wird mit ausgegeben.  

Metazeichen für Grep

Die Metazeichen zur Bildung der regulären Ausdrücke, die mit grep gefunden werden können, sind im wesentlichen in diesem Artikel erläutert. Darüber hinaus gibt es bei der Verwendung des grep Kommandos eine Besonderheit. Die Metazeichen +,?,|,(,) und die Mengenangaben in geschweiften Klammern werden nur unter egrep ausgeführt. Man kann also entweder anstelle von grep den Befehl egrep verwenden oder man verwendet grep mit dem Schalter -E.

Kombination von Suchbefehlen.

Die Befehle grep und find können auch verknüpft werden. Allerdings würde eine Verknüpfung mittels Pipe lediglich in der Standardausgabe des find suchen, und nicht in den Ergebnisdateien
Bsp: find . -name brief*.txt | grep hugo > ergebnis.txt

Sollen die die vom Find gefundenen Dateien durchsucht werden. formuliert man den Befehl wie folgt
find . -name "*.txt" -exec grep --with-filename "Suchwort" '{}' \;

Beispiele

find . -name brief.txt Findet die Dateien mit dem Namen brief.txt im aktuellen Verzeichnis. 
find . -name "brief*.txt"Findet alle Briefe mit dem Muster brief[Zahl].txt.
find . -name "brief?.txt"Findet alle Briefe mit dem Muster brief[Eine Zahl].txt.
find . -perm 600Findet Dateien und Ordner, die exakt die Rechte 600 haben
find . -perm -600Finde Dateien und Ordner, die mindestens die Rechte 600 haben
find . -type d -name FilmeFindet alle Verzeichnisse mit dem Namen Filme 
find . -user muellerFindet Dateien des Users mueller
find . -group lehrerFindet Dateien und Ordner der Gruppe Lehrer
find . -mtime 2Findet Dateien, die vor 2 Tagen geändert wurden.
find . -mtime -2Findet Dateien, die innerhalb 2 Tagen geändert wurden.
find . -daystart -mtime 2Findet Dateien, die von heute 0:00 Uhr gerechnet vor 2 Tagen geändert wurden.
find . -ctime -2Findet Dateien, bei denen innerhalb 2 Tagen der Dateistatus geändert wurde.
find . -newer akt.txtFindet Dateien, die später verändert wurden als akt.txt
find . -amin -10Findet Dateien, auf die innerhalb der letzten 10 Minuten lesend zugegriffen wurde
find . -name "brief?.txt" -mmin -10Findet Dateien nach dem Muster brief?.txt, deren Inhalt innerhalb der letzten 10 Minuten verändert wurde
find . -name "b*.txt" -o -name "z*.txt"Findet Textdateien, die mit b oder z anfangen
find . -name "brief*.txt" -exec cp '{}' ~/found \;Kopiert alle Dateien des Musters brief*.txt in das Verzeichnis found im Homeverzeichnis des angemeldeten Users
find . -atime +365 -ok rm '{}' \;Entfernt alle Dateien, auf die ein Jahr nicht mehr zugegriffen wurde mit Rückfrage.
find . -size +10000k -ok rm '{}' \;Entfernt alle Dateien über 10 MB
find /var/log -amin -20Findet Dateien unter /var/log, auf die innerhalb der letzten 20 Minuten lesend zugegriffen worden ist.
find /home -group root Findet Dateien unterhalb von  /home, die der Gruppe Root gehören.
find /home -maxdepth 2 -user HarryD Findet Dateien, die dem User HarryD gehören. Die durchsuchte Verzeichnistiefe beträgt 2 Ebenen
find /findueb -perm -040Findet Dateien, in denen die Gruppe Leserecht hat
find /findueb –perm -005Findet Dateien, in denen die Others lesen und ausführen dürfen
find /findueb –perm -004 –o –perm -001
find /findueb –perm +005
Findet Dateien, welche die Others lesen oder ausführen dürfen
find /findueb –perm +007Findet Dateien, bei denen die Others irgendwelche Rechte haben
find /boot -size +1MFindet Dateien unter /boot, die größer als 1MByte sind.
find . -size +3k ! -type d
find . size +3k -type f
Findet im Homeverzeichnis alle Dateien, die größer als 3KByte sind, keine Verzeichnisse.
find . -amin -10 | wc -lFindet Dateien, auf die in den letzten 10 Minuten lesend zugegriffen wurde. Es wird nur die Anzahl der Treffer ausgegeben.
find /home -user hdobner 2>/dev/null Findet Dateien des Users hdobner und verwirft Fehlerausgaben.
grep "[fF]" adressen.txt"Gibt alle Zeilen aus, in denen ein kleines oder großes f vorkommt.
grep "/<[mM]" adressen.txt"Gibt alle Zeilen aus, in denen ein Wort mit einem kleinen oder großen m beginnt.
grep -v "^$" adressen.txtGibt alle nicht leeren Zeilen aus.
ls -laF /etc | grep "^[^d]"Zeigt an, welche Einträge eines Listings keine Verzeichnisse sind.
ls -laF /etc | grep "^l"Zeigt an, welche Einträge eines Listings symbolische Links sind.
ls -laF /etc | grep "3. Dez"Zeigt an, welche Dateien am 3.Dezember geändert wurden.

 

Aktualisiert (Sonntag, den 11. April 2010 um 20:04 Uhr)