Zum Inhalt springen

Find/Anwendungen

Aus Foxwiki

Anwendungen

Alle Dateien im aktuellen und allen Unterverzeichnissen (rekursiv)

$ find 

Alle Dateien und Verzeichnissen im Unterverzeichnis foo des aktuellen Verzeichnisses

$ find foo

Suchbereich

Find/Anwendungen/Suchbereich

Dateiname

Find/Anwendungen/Dateiname

Dateityp

Find/Anwendungen/Dateityp

Zeitstempel

Find/Anwendungen/Zeitstempel

Dateigröße

Manchmal ist es nützlich, andere Attribute zur Suche zu verwenden

  • Etwa Dateien nach Größe zu finden
  • Ein gutes Beispiel: du arbeitest mit einem Server und stellst fest, dass eine der Partitionen beginnt, voll zu werden
  • Um welche Datei, oder Dateien, handelt es sich? Mit find suchst du Dateien nach Größe und kannst dich dann darum kümmern, Platz zu schaffen
  • Die Option um nach Größe zu prüfen ist -size, gefolgt von der Größenangabe, nach der du suchst
  • Du kannst alle möglichen Einheiten angeben, von Blöcken (b) bis Gigabytes (G)
  • Um Dateien der Größe 100 kB zu finden, gibst du ein: find -size 100k
  • Damit werden alle Dateien der Größe 100 kB gefunden
  • Das ist ziemlich speziell
  • Um größere oder kleinere Dateien einer bestimmten Größe zu finden, verwendest du + oder - zusätzlich zur Zahl
  • Also sollte find -size +100k alle Dateien größer als 100 kB zurückgeben
  • Und find -size -100k alles was kleiner ist
  • Mit dem -empty-Parameter kannst du auch leere Dateien finden: find -empty -type -f
  • Beachte, dass ich eine zusätzliche Prüfung für den Typ der Datei verwende
  • Ohne diese Option wird find Verzeichnisse als "leere Dateien" anzeigen
-size Number[Einheit]

Findet Dateien einer bestimmten Dateigröße

  • In der Voreinstellung ist die Einheit 512 Byte große Blöcke, das heißt, bei Number=1 werden alle Dateien mit einer Größe zwischen 1 und 512 Bytes gefunden
  • Als Einheit kann stehen: b für 512 Byte-Blöcke (Voreinstellung), c für 1 Byte-Blöcke, k für Kilobyte-Blöcke und w für 2 Byte-Blöcke
Maximale Größe
find -size -100c -ls
  • Nach Dateien suchen, die bis zu 100 Bytes belegen
  • Das - vor der Zahl bedeutet "bis zu"
  • Das c hinter der Zahl bedeutet character, welche früher 1 Byte belegten, aber b ist schon für die Maßeinheit Block (= 512 Bytes) vergeben
  • Mittels -ls läßt sich die Größe der gefundenen Dateien überprüfen
  • Deswegen wird es hier, vor den anderen Aktionen, erwähnt
Exakte Größe
find -size 100c -ls
  • nach Dateien suchen, die genau 100 Bytes groß sind (kein Vorzeichen)
Mindestgröße
find -size +100M
  • Nach Dateien suchen, die 100 Megabytes oder größer sind (Vorzeichen +)
  • Statt M kann man auch k und G für Kilobytes und Gigabytes angeben
Zwischen Mindest- und Maximalgröße
find -type f -size +64c -size -4096c | wc -l
  • Nur nach Dateien suchen, die zwischen 64 und 4096 Bytes groß sind, und per Pipe an wc übergeben, um die Anzahl der gefundenen Dateien zu bestimmen
Blockgröße
find -size 10
  • Ohne Angabe zur Maßeinheit wird die Zahl als Anzahl Blöcke interpretiert, hier also nach 10 Blöcken à 512 Bytes
  • Die Angabe b ist gleich bedeutend
  • Wenn es Probleme mit der Größe gibt, dann wahrscheinlich, weil man c oder k oder M vergessen hast
Leeren Dateien

Leere Verzeichnisse und Dateien der Größe 0 find -empty

-empty

die reguläre Datei oder das Verzeichnis ist leer

"size N[{c,k}]"

die Datei belegt N Datenblöcke zu 512 Bytes, oder N Bytes und N Kilobytes mit nachgestelltem c oder k

Besitzer und Gruppe

$ find / -user BENUTZERNAME
Dateien nach Benutzer suchen

Ein weiterer nützlicher Einsatz von find ist es, Dateien nach Besitzerstatus zu lokalisieren, sogar Dateien mit fehlendem Besitzer

  • Schauen wir uns das mal an
  • Wenn du Dateien zwischen Systemen verschoben hast, oder wenn du Benutzer entfernt hast, hast du möglicherweise verwaiste Dateien
  • Um solche zu finden nimmst du: find -nouser
  • Um Dateien, die tatsächlich im Besitz eines bestimmten Benutzers sind, zu finden, nimmst du die -user oder -uid Optionen
  • Die -uid Option erlaubt dir nach der nummerischen User-ID (UID) zu suchen und -user erlaubt dir nach Name oder UID zu suchen
  • Also wenn ich alle meine Dateien in einem Verzeichnis finden will benutze ich find -user jzb
  • Oder ich könnte find -user 1000 oder find -uid 1000 eingeben
  • Vielleicht suchst du die Dateien die Benutzer A oder B gehören
  • Das kannst du erreichen indem du den Operator -o hinzufügst: find -user root -o -user www-data
  • Damit werden alle Dateien gefunden die Benutzer root oder www-data gehören
  • Wenn du umgekehrt alle Dateien finden möchtest die nicht dem bestimmten Benutzer gehören, nimmst du den -not-Operator: find -not -user www-data
  • Natürlich funktioniert -not auch zusammen mit anderen Optionen
  • Du könntest nach allen Dateien suchen die einem Benutzer gehören, die nicht mehr als eine bestimmte Größe haben
  • Beispiel: find -user www-data -not -size +100k
-user Nutzer

Findet Dateien des "Nutzers" (UID oder Nutzername)

Alle Dateien im Verzeichnis /tmp, die user gehören
find /tmp/ -user user 2>/dev/null
/tmp/kfm-cache-500
/tmp/kfm-cache-500/index.html
/tmp/kfm-cache-500/index.txt
/tmp/acout.1364.NHKnJh
/tmp/acin.1364.c36auh
Dateien nach Gruppen suchen (-group)

Eine weitere Möglichkeit, nach Dateien zu suchen ist nach Gruppe, mit der -group-Option

  • Diese Option arbeitet mit einem Gruppennamen oder einer Gruppen-ID (GID)
  • Die grundlegende Syntax ist find -group groupname
  • Können mit anderen Operatoren kombiniert werden, um zum Beispiel Dateien eines Benutzers zu finden, die auch zu einer bestimmten Gruppe gehören.s
-user Name

die Datei gehört dem Anwender Name

-uid N

die Kennziffer des Eigentümers ist N

-gid N

die Datei gehört der Gruppe mit der Kennzahl N

-group Name

die Datei gehört der Gruppe Name

-nouser

die Datei gehört keinem im System eingetragenen Benutzer

-nogroup

die Datei gehört keiner im System angemeldeten Gruppe

Zugriffsrecht

Gelegentlich möchtest du dein Dateisystem nach Dateien überprüfen, die global beschreibbar sind, oder sonstige "falsche" Berechtigungen haben

  • Das find-Werkzeug unterstützt dies mit mehreren verschiedenen Optionen
  • Am einfachsten sind die Operatoren -readable, -writable, und -executable
  • Diese prüfen die Berechtigungen des aktuell angemeldeten Benutzers, der find aufruft
  • Beachte, dass diese Optionen in älteren Versionen von find nicht verfügbar sind
  • Also wenn deine Distribution etwas älter ist hast du diese Optionen eventuell noch nicht
  • Ein andere Option nach der Dateiberechtigung zu suchen ist die Benutzung von -perm, was nach dem aktuellen Dateistatus schaut
  • Auf diese Art kannst du sehen ob eine Datei mit einer bestimmten Kombination von Berechtigungen übereinstimmt
  • Zum Beispiel wenn du sehen willst welche Dateien von Benutzer und Gruppe ausführbar sind, nimmst du: find -type f -perm -110
  • Die 110 sagt find "Schau nach Dateien das Ausführen-Bit für Benutzer und Gruppe gesetzt haben!" und das - sagt find die anderen Bit zu ignorieren
  • Das heißt, es spielt keine Rolle, wenn die Datei auch beschreibbar oder lesbar ist, solange die Bit gesetzt sind, die sie ausführbar machen
  • Um die Suche auf Dateien einzuschränken, die exakt dem angegeben Staus entsprechen, benutzt du nicht den - -Operator

Was, wenn du nach Dateien suchst die das Ausführen-Bit für Benutzer oder Gruppe haben? Dann nimmst du / statt - :

$ find -type f -perm /110

Jede Datei, die die Gruppen- oder Eigentümer-Berechtigung hat, wird gefunden

  • Suchen nach Berechtigung kann überaus hilfreich sein, aber auch komplex
  • Es kann etwas dauern um die Syntax zu verstehen, besonders für die, die noch nicht mit dem Eigentümer/Berechtigung-Konzept vertraut sind
  • In diesem Fall ist das Lesen der man-Seiten nicht nur empfehlenswert, sondern unerlässlich
-perm Modus

Findet Dateien, deren Rechte exakt dem angegebenem Modus entsprechen (Angabe numerisch oder symbolisch)

  • die Zugriffsrechte auf die Datei entsprechen exakt dem Modus; der Modus kann als Oktalzahl oder mit den bei chmod(1) beschriebenen Kennungen beschrieben werden, die Kennungen werden auf Modus 000bezogen
-perm -Modus

Findet Dateien, bei denen mindestens die durch Modus angegebenen Rechteflags gesetzt sind

(mindestens) die Zugriffsrechte für den Modus sind gesetzt

-perm +Modus

Findet Dateien, bei denen mindestens eines der durch Modus angegebenen Rechteflags gesetzt ist

  • die Zugriffsrechte entsprechen höchstens dem Modus (oder sind weiter eingeschränkt)

Links

-links Anzahl

Findet Dateien, auf die Anzahl fester Links zeigen

Dateien im Verzeichnis /usr mit 43 harten Links
find /usr/ -links 43 2>/dev/null /usr/include /usr/share

In den Ausgaben wurden die Fehler nach "/dev/null" verschoben, da find natürlich nur Verzeichnisse unter die Lupe nimmt, zu dessen Zugang der Benutzer berechtigt ist

-lname Muster

die Datei ist ein symbolischer Link auf eine Datei oder ein Verzeichnis mit einem zum Muster passenden Namen

-inum IN

die Datei belegt die Inode mit der Nummer N

find all the hard links

A common request is a way to find all the hard links to some file

  • Using "ls ‑li file" will tell you how many hard links the file has, and the inode number
  • You can locate all pathnames to this file with:
find mount-point -xdev -inum inode-number
  • Since hard links are restricted to a single filesystem, you need to search that whole filesystem so you start the search at the filesystems mount point. (This is likely to be either "/home" or "/" for files in your home directory.)
  • The "‑xdev" option tells find to not search (descend into) any other filesystems
  • While most Unix and all Linux systems have a find command that supports the "‑inum" criterion, this isnt POSIX standard
  • Older Unix systems provided the "ncheck" utility instead that could be used for this

Bedingungen verknüpfen

find hält logische Operatoren bereit, um verschiedene Kriterien miteinander zu verknüpfen

Tests kombinieren
  • <c1> -a <c2>: Wahr, wenn beide, <c1> und <c2>, wahr sind. -a wird bereits implizit aktiviert, daher brauchen Sie nur <c1> <c2> <c3>
  • eingeben, wenn Sie alle Tests <c1>, <c2>,
  • durchführen möchten
  • <c1> -o <c2>: Wahr, wenn entweder <c1>, <c2> oder beide wahr sind. -o hat eine geringere Wertigkeit als -a
  • Wenn Sie also Dateien möchten, die Kriterium <c1> oder <c2> und Kriterium <c3> entsprechen, müssen Sie Klammern verwenden: ( <c1>-o <c2> ) -a <c3>
  • Damit die hier verwendeten Klammern nicht von Ihrer Shell interpretiert werden, müssen Sie sie durch Voranstellen eines Rückstriches (\) schützen
  • -not <c1>: Invertiert den Test <c1>
  • Also ist -not <c1> wahr, wenn <c1> falsch ist
Operatoren

Die Optionen, Tests und Aktionen können mit Operatoren verknüpft werden

  • Die Bearbeitung erfolgt von links nach rechts
( Ausdruck ) die Klammern fassen den Ausdruck zu einer Operation zusammen
! Ausdruck ist wahr, wenn der Ausdruck falsch ist
-not Ausdruck ist ebenfalls wahr, wenn der Ausdruck falsch ist
Ausdruck1 Ausdruck2 UND Verknüpfung; wenn Ausdruck1 wahr ist, wird Ausdruck2 bewertet (ausgeführt)
Ausdruck1 -a Ausdruck2 auch eine UND Verknüpfung
Ausdruck1 -and Ausdruck2 auch eine UND Verknüpfung
Ausdruck1 -o Ausdruck2 ODER Verknüpfung; Ausdruck2 wird bewertet (ausgeführt), wenn Ausdruck1 falsch ist
Ausdruck1 -or Ausdruck2 auch eine ODER Verknüpfung
Ausdruck1 , Ausdruck2 Liste; beide Ausdrücke werden immer bewertet (ausgeführt); der Wahrheitswert des gesamten Ausdrucks entspricht dem von Ausdruck2
Und-Kombination

Treffer müssen alle Kriterien erfüllen find -mindepth 3 -maxdepth 5

  • Finde ab Unterverzeichnis(se) 3 (mindepth 3) UND bis Unterverzeichnis(se) 5 (-maxdepth 5)
  • Weiters Beispiel der UND-Kombination
find -mindepth 3 -type f -name "*.avi" -size +5M
  • Beginnt die Suche ab Unterverzeichnis(se) 3 (-mindepth 3), UND findet nur gewöhnliche Dateien (‑type f), die die Endung .avi besitzen UND mindestens 5 MB groß sind (-size +5M)
Oder-Kombination
find -name "susi.*" -or -name "susanne.*"
  • Sucht alle Dateien die mit "susi." ODER "susanne." beginnen
ODER oder NICHT-Kombination

Man kann die Suchoptionen aber auch per ODER oder NICHT verknüpfen:

  • Negation
find ! -name "*.avi" -not -name "*.mp*g"
  • Sucht Dateien die von der Dateiendung weder avi, noch mpg oder mpeg sind
  • Ausrufezeichen und -not sind gleichbedeutend
Klammerung

Bei umfangreichen Kombinationen kann eine Klammerung erforderlich sein, um das gewünschte Resultat zu erhalten

ohne Klammern
find -name "susi.*" -or -name "susanne.*" -name "*.txt"
  • Ohne Klammern wird erst die UND-Verbindung gebildet, also "susanne.*" und "*.txt", danach erst ODER "susi". susi.png würde also gefunden
mit Klammern
find \( -name "susi.*" -or -name "susanne.*" \) -name "*.txt"
  • Klammern müssen maskiert werden
  • Hier wird jetzt für alle Dateien erfordert, dass diese auf .txt enden
Beispiel

Suche nach ausführbaren Dateien (keine Verzeichnisse), die user gehören

find . -maxdepth 1 \! -type d -a -perm +111 -a -user user ./.xinitrc ./.xsession ./dialog ./selfeditor.pl
Erläuterung
  • Die Suche wurde auf das aktuelle Verzeichnis beschränkt "-maxdepth 1"
  • Verzeichnisse ausgeschlossen "\! -type d" (das "!" ist ein Sonderzeichen der Shell, deswegen muss die Auswertung durch die Shell verhindert werden)
  • Es sollen alle Dateien gefunden werden, bei denen mindestens in einer [../../../F:%5Cebooks%5CLinux%5CEinführungen%5Clinuxfibel%5Ceigentum.htm Rechtegruppe] das x-Flag gesetzt ist "-perm +111" und die user gehören "-user user"
  • Die Suchkriterien sind jeweils per UND zu verknüpfen
  • Da find rekursiv alle Unterverzeichnisse (eventuell bis zu einer bestimmten Tiefe) durchsucht, kann die Ausführung sehr langwierig werden