Zum Inhalt springen

Find: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „line>“ durch „line copy>“
 
(202 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''find''' ist ein Kommandozeilenprogramm für die Dateisuche. Dabei kann man auf vielfältige Weise die Suche filtern, z.B. nach Dateiname, -alter, -größe und die Suchergebnisse weiterverarbeiten und/oder formatiert ausgeben.
'''find''' - Dateien nach Eigenschaften suchen


'''find''' ist ein Kommandozeilenprogramm für die Dateisuche.
== Beschreibung ==
* Dabei kann man auf vielfältige Weise die Suche filtern, zum Beispiel nach Dateiname, -alter, -größe und die Suchergebnisse weiterverarbeiten und/oder formatiert ausgeben.
; Werkzeug für die Suche nach Dateien
Auf vielfältige Weise die Suche filtern
* Etwa Dateiname, -alter oder -größe
* Formatierung der Ergebnisliste
* Suchergebnisse können weiterverarbeitet werden


= Beschreibung =
=== Implementierungen ===
Nicht alle Implementierungen sind identisch


$ '''find [PFAD...] [AUSDRUCK...]'''
* Der Befehl ''find'' ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X
* find ist ein äußerst mächtiges Instrument zum Suchen von Dateien.
* Ein Großteil der Syntax von ''find'' ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig
* Mit PFAD kann dem Kommando ein beliebiges Startverzeichnis für die Suche angegeben werden.
* Bei Schwierigkeiten prüfen Sie die [[man]]-Page des Systems
* Fehlt die Angabe, startet das Kommando im aktuellen Verzeichnis.
* Allerdings ist der Verzicht auf die Pfadangabe nur bei der GNU-Version (also unter Linux) des Kommandos gestattet, deswegen empfiehlt es sich, die Angabe immer vorzunehmen.
* find durchsucht in der Voreinstellung rekursiv alle Unterverzeichnisse.
* Deshalb lassen sich die Anzahl der Ebenen (Option --maxdepth Anzahl) beschränken.


»Anzahl=1« bedeutet dabei die Suche einzig im angegebenen Verzeichnis.
<syntaxhighlight lang="bash" highlight="1" line copy>
* Die gebräuchlichste Methode wird die Suche nach Dateien mit einem bestimmten Namen sein.
find --version
* Die Option -name Dateiname ermöglicht dies.
find (GNU findutils) 4.10.0
* Dateiname kann dabei die Shell-Metazeichen zur Dateinamenserweiterung enthalten, in dem Falle muss der Name vor der Auswertung durch die Shell geschützt werden, indem er in Anführungsstriche (doppelt/einfach) eingeschlossen wird.
Aktivierte Eigenschaften:D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=1)
'''find /usr -maxdepth 3 -name "XF*"''' 
</syntaxhighlight>
/usr/X11R6/bin/XF86_Mach64 
/usr/X11R6/bin/XF86Setup 
/usr/X11R6/bin/XF86_VGA16 
/usr/X11R6/bin/XFCom_Cyrix 
/usr/X11R6/bin/XFCom_Matrox 
/usr/X11R6/bin/XFCom_Trident
* Dateien verfügen über viele Eigenschaften.  
* Sie haben einen Besitzer, Rechte, mehrere Zeitstempel, einen Typ, und so weiter Für jede dieser Eigenschaften existieren Optionen, mit denen sich gezielt Dateien bestimmter Charakteristik herausfischen lassen.
* Da unter unixoiden Systemen der Leitsatz ''"Alles ist eine Datei"'' gilt, werden auch Verzeichnisse gefunden.
* Eine Alternative zu find (mit Vor- und Nachteilen) bietet der Befehl [http://wiki.ubuntuusers.de/locate locate].


==== Implementierungen ====
=== Abgrenzung ===
* Nicht alle Implementierungen von ''find'' sind gleich.
{| class="wikitable sortable options"
* Der Befehl ''find'' ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X.
* Ein Großteil der Syntax von ''find'' ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig.
* Bei Schwierigkeiten prüfen Sie die mab-Page Ihres Systems.
Version of find:
$ '''find --version'''
find (GNU findutils) 4.4.2
 
=== Alternativen ===
find ist fast immer das Mittel der Wahl, wenn es darum geht, auch Unterverzeichnisse zu durchsuchen.
 
'''locate'''
* Wenn man den Dateinamen genau kennt, kann [http://wiki.ubuntuusers.de/locate locate] eine bessere Wahl sein.
* locate arbeitet allerdings mit einem Index, der 1x täglich aktualisiert wird, und findet daher ganz frische Dateien nicht.
 
''' Suche nach Programmen'''
* wird man ''whereis'' benutzen.
 
'''aktuelles Verzeichnis (ohne Unterverzeichnisse)'''
* [http://wiki.ubuntuusers.de/Terminal#Vervollstaendigen-lassen-nicht-tippen automatischer Vervollständigung]
* Jokerzeichen ''*</nowiki>'' und ''?''
* Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen
** [http://wiki.ubuntuusers.de/ls ls]
** [http://wiki.ubuntuusers.de/Shell/grep Shell/grep].
 
= Installation =
= Syntax =
$ '''find [-H] [-L] [-P] [-D Fehlersuchoptionen] [-OStufe] [Startpunkt …] [Ausdruck]'''
 
== Parameter ==
== Optionen ==
{|| class="wikitable sortable" class="wikitable"
|-
! Option !! Beschreibung
|-
|-
| -name dateiname||Sucht Dateien des Namens dateiname
! Programm !! Beschreibung
|-
|-
| -iname dateiname||Sucht nach dateiname und ignoriert Groß- und Kleinschreibung
| [https://wiki.ubuntuusers.de/Terminal#Vervollstaendigen-lassen-nicht-tippen automatischer Vervollständigung] ||
|-
|-
| -size [+-]groesse[ck]||Sucht Dateien, die größer oder kleiner als groesse sind. c steht für Byte- und k für KByte-Werte. Ohne Einheitsangabe wird nach der Anzahl der belegten Blöcke (512 Byte) gesucht
| [[ls]] || Dateien auflisten
|-
|-
| -type [fdl]||Sucht Dateien eines bestimmten Typs: f für einfache Dateien, d für Verzeichnisse und l für symbolische Links
| [[Jokerzeichen]] (''*'',''?'', ...) ||
|-
|-
| -atime [+-]zeit||Sucht Dateien, auf die seit mehr oder weniger als zeit Tagen nicht mehr zugegriffen wurde
| [[locate]] || Suche nach Dateinamen
* Schnell, da indexbasiert (täglich aktualisiert)
* Findet nur Dateien, die im Index enthalten sind
|-
|-
| -amin [+-]zeit||Sucht Dateien, auf die seit mehr oder weniger als zeit Minuten nicht mehr zugegriffen wurde
| [[whereis]] || Suche nach Programmen
|-
| -mtime [+-]zeit||Sucht Dateien, die seit mehr oder weniger als zeit Tagen nicht mehr verändert wurden
|-
| -mmin [+-]zeit||Sucht Dateien, die seit mehr oder weniger als zeit Minuten nicht mehr verändert wurden
|-
| -perm 0000||Sucht Dateien mit den den Zugriffsrechten 0000 (Oktalzahl)
|-
| -user benutzername||Sucht Dateien des Benutzers benutzername
|-
| -exec befehl „{}“ „;“||Führt befehl mit den gefunden Dateien als Parameter aus. Die geschweiften Klammern stehen für den aktuell gefunden Dateinamen
|-
| -ok befehl „{}“ „;“||Führt befehl nach Rückfrage aus
|-
|-
| [[grep]]|| Dateiinhalte durchsuchen
|}
|}


= Anwendungen =
== Installation ==
find - sucht in einer Verzeichnishierarchie nach Dateien 
''find'' ist Teil des Pakets [[findutils]]


$ '''find [-H] [-L] [-P] [Verzeichnis...] [Ausdruck]'''
== Aufruf ==
* GNU find durchsucht eine oder mehrere Verzeichnishierarchien und bewertet dabei den Ausdruck von links nach rechts entsprechend den Regeln der Priorität (siehe Abschnitt OPERATOREN) bis das Ergebnis bekannt ist (die linke Seite ist falsch für UND Operatoren, wahr für ODER Operatoren).
<syntaxhighlight lang="bash" highlight="1" line copy>
* Anschließend führt find die Suche mit der nächsten Datei fort.
find [-H] [-L] [-P] [-D Fehlersuchoptionen] [-OStufe] [Startpunkt …] [Ausdruck]
* Beginnen wir mit dem Grundlagen.
</syntaxhighlight>
* Wenn du eine Datei suchst und kennst den Namen der Datei - nur nicht den Ort wo du sie abgelegt hast - dann ist die Syntax einfach.
* Lass ''find'' einfach nach dem speziellem Namen suchen: find -name filename
* Angenommen ''filename'' existiert, dann wird ''find'' den Speicherort der Datei/Dateien anzeigen.
* Wie etwa hier:
'''find -name filename'''  ./projects/filename
 
find ist ein traditionelles Unix-Programm.
* Es dient zum rekursiven Suchen von Dateien nach bestimmten Kriterien in einem oder mehreren Verzeichnissen.
* Es ist wirklich nützlich, die Syntax verlangt allerdings etwas Übung:
$ '''find [Optionen] [Verzeichnisse] [Kriterium] [Handlung]'''
* Geben Sie kein Verzeichnis an, durchsucht find das aktuelle Verzeichnis.
* Geben Sie das Kriterium nicht an, gilt sein Wert als ,,wahr`` und alle Dateien werden gefunden.
* Die Optionen, Kriterien und Aktionen sind so mannigfaltig, dass hier nur wenige erwähnt werden können.
* The ''find'' command is used to locate files on a Unix or Linux system. ''find'' will search any set of directories you specify for files that match the supplied ''search criteria''.
* You can search for files by name, owner, group, type, permissions, date, and other criteria.
* The search is recursive in that it will search all subdirectories too. 
* The syntax looks like this:
* find ''where-to-look criteria what-to-do''
* All arguments to ''find'' are optional, and there are defaults for all parts.
* This may depend on which version of ''find'' is used.
* Here we discuss the freely available Gnu version of ''find'', which is the version available on ''YborStudent''.)
* For example, ''where-to-look'' defaults to ''.''(that is, the current working directory), ''criteria'' defaults to none (that is, select all files), and ''what-to-do'' (known as the ''find'' ''action'') defaults to ''‑print'' (that is, display the names of found files to standard output).
* Technically, the criteria and actions are all known as ''find'' ''primaries''.
* For example:  find
* will display the pathnames of all files in the current directory and all subdirectories.  The commands  find . -print  find -print  find .
* do the exact same thing.  Here's an example ''find'' command using a search criterion and the default action:  find / -name foo
* This will search the whole system for any files named ''foo'' and display their pathnames.
* Here we are using the criterion ''‑name'' with the argument ''foo'' to tell ''find'' to perform a name search for the filename ''foo''.  The output might look like this:  /home/wpollock/foo  /home/ua02/foo  /tmp/foo
* If ''find'' doesn't locate any matching files, it produces no output.
* The above example said to search the whole system, by specifying the root directory (“''/''”) to search.
* If you don't run this command as root, ''find'' will display a error message for each directory on which you don't have read permission.
* This can be a lot of messages, and the matching files that are found may scroll right off your screen.
* A good way to deal with this problem is to redirect the error messages so you don't have to see them at all:  find / -name foo '''2>/dev/null'''
* You can specify as many places to search as you wish:  find /tmp /var/tmp . $HOME -name foo
 
===  Ausdrücke  ===
Ein Ausdruck besteht aus Optionen (welche das allgemeine Verhalten der Kommandos bestimmen und immer wahr zurückgeben), Tests (welche wahr oder falsch zurückgeben) und Aktionen (welche wahr oder falsch zurückgeben).
* Optionen, Tests und Aktionen werden über Operatoren verknüpft.
* Wenn kein Operator explizit angeben ist, wird der UND Operator -and verwendet.
* Wenn der Ausdruck keine andere Aktion als -prune enthält, wird mit allen Dateien, für welche der Ausdruck wahr ergibt, die Aktion -print durchgeführt.
 
===  Exit Status ===
Der Status von find ist Null, wenn alle Aktionen erfolgreich waren, im Fehlerfall ist der Status größer als Null.
 
===  Tests ===
Ein Kriterium kann einen oder mehrere atomare Tests umfassen.
 
====  -true  ====
ist immer wahr
 
====  -false  ====
ist immer falsch
 
===  Optionen ===
'''Sollten am Anfang des Ausdrucks stehen'''
* Alle Optionen geben immer logisch wahr zurück.
* Mit der Ausnahme von -follow und -daystart haben sie immer Auswirkungen und werden nicht erst dann verarbeitet, wenn ihre Position im Ausdruck erreicht wird.
* Daher sollten ist es für bessere Lesbarkeit besser, sie an den Anfang des Ausdrucks zu stellen.
* Eine Warnung wird ausgegeben, wenn Sie das nicht machen.
 
====  -noleaf  ====
erzwingt die Bearbeitung aller Verzeichniseinträge
* Normalerweise kann davon ausgegangen werden, dass jedes Linuxverzeichnis wenigstens zwei (harte) Links enthält: * das Verzeichnis .
* ist ein Link auf das Verzeichnis selbst, und jedes Unterverzeichnis enthält den Eintrag
* ..
* als Link auf das Oberverzeichnis
* Wenn find bei der Untersuchung eines Verzeichnisses zwei Unterverzeichnisse weniger untersucht hat, als das Verzeichnis Links zählt, kann deshalb normalerweise die weitere Suche beendet werden
 
====  Suche abbrechen ====
Es besteht aber die Möglichkeit, eine Suche abzubrechen, sobald im Verzeichnis- oder Dateinamen ein bestimmtes Textmuster enthalten ist.
* Dem jeweiligen Suchkriterium ("-name" oder "-path") ist die Option -prune hinten an zu stellen:
 
# Anzeige alle Dateien "-print", deren Name nicht mit einem Punkt beginnt</nowiki> find . -path './.*' -prune -o -print . ./nsmail ./iglinux.tgz ./linuxbuch
 
===  Suchkriterien ===
Alle numerischen Argumente können auf drei Arten angegeben werden:
 
{|| class="wikitable sortable" class="wikitable sortable"
|-
|  | '''+ N '''
|  | steht für alle Zahlen größer als N
|-
|  | '''- N '''
|  | steht für alle Zahlen kleiner als N
|-
|  | '''N '''
|  | steht für genau N
|-
|}
 
* Alle Tests werden auf die Dateien in den angegebenen Verzeichnissen einzeln angewendet.
* Die Tests liefern einen Wahrheitswert von 0 (Wahr), wenn der Test erfolgreich war.
* Die Tests auf die erweiterten Zeitmarken (Zugriff und Erstellung) werden nur in solchen Verzeichnissen korrekt behandelt, die auf einem der neuen Linuxdateisysteme angesiedelt sind (e2fs, xiafs, new minix).
* Auf den anderen Dateisystemen wird nur das Datum der letzten Änderung zuverlässig getestet.
* Das Ergebnis der anderen Tests hängt davon ab, ob der letzte Zugriff oder die letzte Änderung so kurz zurückliegen, dass die veränderte I-Node noch im Arbeitsspeicher (Cache) ist.
* Dann können auch für die Dateien der alten Dateisysteme alle drei Zeitmarken unterschieden werden.
 
===  Suchbereich ===
====  Startverzeichnis(se) ====
Suche nach allen Dateien und allen Unterverzeichnissen im aktuellen Verzeichnis:  find
* Suche nach allen Dateien und Verzeichnissen im Unterverzeichnis '''foo''' des aktuellen Verzeichnisses:  find foo
* Suche alle Dateien und Verzeichnisse im übergeordneten Verzeichnis:  find ../ 
* Suche in einem ganz anderen Verzeichnis beginnen (im absoluten Pfad '''/tmp'''):  find /tmp 
* Suche in zwei Verzeichnissen (sucht sowohl in '''/tmp''' als auch in '''/boot'''):  find /tmp /boot
* Suche überall (Sucht im Wurzelverzeichnis alle Dateien und alle Unterverzeichnisse - das kann dauern!):  find /
 
====  Verzeichnistiefe  ====
Sometimes ''find'' provides more results than you need, or want.
* You can limit ''find'' results by using the '''-maxdepth''' option.
* For example, if you wanted to find every JavaScript file in your wordpress directory, you would use this: find wordpress -name '*js'
* But what if you only want to see if there are any JavaScript files in the top-level directory? You can limit that with '''-maxdepth''': find wordpress -maxdepth 1 -name '*js'   
* That will only search the '''wordpress''' directory, but not any of the subdirectories.
* Changing the '''-maxdepth''' to 2 would search subdirectories in the wordpress directory, but it would exclude their subdirectories.
 
find -maxdepth 3
* steigt bei der Suche nur 3 Verzeichnisebenen herab.
 
=====  -depth  =====
bearbeitet den Inhalt jedes Verzeichnisses vor dem Verzeichnis selbst.
 
=====  -maxdepth Ebenen  =====
steigt bis zu der gegebenen Zahl von Ebenen im Verzeichnisbaum auf (in der Hierarchie ab); bei 0 Ebenen werden die Tests nur auf die in der Kommandozeile übergebenen Dateien und Verzeichnisnamen angewendet
 
===== -maxdepth <n> =====
Suche nach Dateien, die sich maximal n Verzeichnisebenen unter dem angegebenen Verzeichnis befinden.
 
=====  -mindepth Ebenen  =====
steigt mindestens die gegebene Zahl von Ebenen im Verzeichnisbaum auf (in der Hierarchie ab); bei einer Ebene werden die in der Kommandozeile genannten Dateien und Verzeichnisnamen nicht bearbeitet
 
===== -mindepth <n> =====
Gehe mindestens <n> Verzeichnisebenen unter das angegebene Verzeichnis zurück, bevor die Suche gestartet wird.
 
====  Verzeichnisse ausschließen ====
Use the prune switch, for example if you want to exclude the misc directory just add a -path ./misc -prune -o to your find command: find . -path ./misc -prune -o -name '*.txt' -print
* Here is an example with multiple directories: find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print find / \( -path /etc -o -path /dev -o -path /proc -o -path /sys \) -prune -o -name fstab -print
* Here we exclude dir1, dir2 and dir3, since in find expressions it is an action, that acts on the criteria -path dir1 -o -path dir2 -o -path dir3 (if dir1 or dir2 or dir3), ANDed with type -d.
* Further action is -o print, just print.* shouldn't find . -name ./misc ...
* be find . -path ./misc ...?
* Hmm.
* This doesn't work for me either as it will include the ignored directory "./misc" in the output.
* Try to use misc instead of ./misc, that worked for me
* It probably didn't work for you because you didn't add a -print (or any other action) explicitly after -name.
* In that case, both "sides" of -o end up printing, whereas if you use -print, only that side prints.
 
===== All answers using -prune are wrong. The right way is: =====
find -name "*.js" -not -path "./directory/*"* One of the comments in the accepted answer points out the problem. -prune does not exclude the directory itself, it exclude its content, which means you are going to get an unwanted line in the output with the excluded directory. –
* Great answer.
* I'd add to this that you can exclude a directory at ANY level by changing the first .
* to *.
* so find -name "*.js" -not -path "*/omitme/*" would omit files from a directory named "omitme" at any level of depth.
* It still traverses all of the unwanted directory, though.
* I'm adding my own answer. :-)
* Note, however, that the prune option only doesn't work if you don't use -print explicitly.
* It would be better to say "This is an alternative to using -prune".
* The answers suggesting -prune are clearly not wrong, they just aren't the way you would do it.
 
====  Umgang mit symbolischen Links ====
Die Optionen -H, -L und -P bestimmen den Umgang mit symbolischen Links* Darauf folgende Kommandozeilenparamter müssen die Datei- oder Verzeichnisnamen sein, die untersucht werden sollen.
* Das erste Argument, das mit einem -, einer Klammer (, ), einem Komma , oder einem Ausrufezeichen ! beginnt, wird als Anfang eines Ausdrucks interpretiert, der bestimmt, wonach gesucht wird.
* Alle Argumente davor werden als Verzeichnisnamen angesehen.
* Wenn kein Verzeichnis angegeben ist, wird das aktuelle Verzeichnis genommen.
* Wenn keine Aktion angegeben ist, wird die Aktion -print ausgeführt (es wird stattdessen empfohlen -print0 zu verwenden).
 
===== -P  =====
Keinen symbolischen Links folgen* Dies ist das Standardverhalten.
* Wenn find eine Datei untersucht oder Informationen über diese ausgibt, und die Datei ein symbolischer Link ist, dann werden die Informationen von dem symbolischen Link selbst verwendet.
 
===== -L  =====
Symbolischen Links folgen* Wenn find eine Datei untersucht oder Informationen über diese ausgibt, dann werden die Informationen von der Datei verwendet, auf die der symbolische Link verweist (es sei denn, der Link ist kaputt oder find nicht in der Lage ist, die Datei zu untersuchen, auf die der Link zeigt).
* Die Verwendung dieser Option impliziert die Option -noleaf.
* Wenn Sie später die Option -P verwenden, wird -noleaf immer noch Auswirkungen zeigen.
* Wenn -L aktiv ist und find einen symbolischen Link zu einem Unterverzeichnis während seiner Suche findet, wird das Unterverzeichnis durchsucht, auf das der symbolische Link zeigt.
* Wenn die Option -type immer auf den Typ der Datei angewendet, auf die ein symbolischer Link zeigt, anstatt auf den Link selbst (es sei denn, der symbolische Link ist kaputt).
* Die Verwendung von -L bewirkt, dass die Prädikate -lname und -ilname immer logisch falsch zurückliefern.
 
===== -H  =====
Keinen symbolischen Links folgen, es sei denn * ...die Parameter in der Kommandozeile werden ausgewertet.
* Wenn find Dateien auswertet oder Informationen über diese ausgibt, werden die verwendeten Informationen vom symbolischen Link selbst benutzt werden.
* Die einzige Ausnahme dieses Verhaltens ist, wenn eine in der Kommandozeile angegebene Datei ein symbolischer Link ist und dem Link gefolgt werden kann.
* In dieser Situation werden die Informationen der Datei genommen, auf die der symbolische Link verweist.
* Die Informationen über den Link selbst dienen als Fall-Back für den Fall, dass die Datei, auf die der Link zeigt, nicht untersucht werden kann.
* Wenn -H aktiv ist und einer der Pfade in der Kommandozeile ein symbolischer Link zu einem Verzeichnis ist, werden die Inhalte dieses Verzeichnisses untersucht (wobei natürlich -maxdepth 0 das verhindern kann).
 
=====  -follow  =====
Veraltet.
* Verwenden Sie die Option -L stattdessen.
* Dereferenziert symbolische Links.
* Impliziert -noleaf.
* Wenn die Option -H oder -L nicht angegeben wird, ändert die Position von -follow das Verhalten des Prädikats -newer.
* Alle Dateien, die als Argumente von -newer aufgeszählt sind, werden dereferenziert, wenn es sich bei ihnen um symbolische Links handelt.
* Das gleiche gilt für -anewer und -cnewer.
* Genauso wird das Prädikat -type immer auf den Typ der Datei angewendet, auf den der symbolische Link zeigt und nicht auf den Link selbst.
* Die Verwendung von -follow hat zur Folge, dass die Prädikate -lname und -ilname immer logisch falsch zurückliefern.
 
==== Dateisysteme ====
=====  -xdev  =====
durchsucht keine Verzeichnisse in anderen Dateisystemen/Partitionen
 
=====  -fstype Typ  =====
die Datei ist in einem Dateisystem vom angegebenen Typ; unter anderem werden minix, msdos, ext und proc erkannt
 
===  Name ===
Mit vollständigem Namen  find -name hausarbeit.odt
* Sucht die Datei '''hausarbeit.odt''' im aktuellen Verzeichnis und allen Unterverzeichnissen.
* Sind mehrere Dateien dieses Namens vorhanden, werden alle Fundstellen aufgelistet.
* Jokerzeichen, [http://de.wikipedia.org/wiki/Wildcard_%28Informatik%29 Wildcards], wie der ''*</nowiki>'' oder das ''?'' müssen maskiert werden, sonst interpretiert sie schon die Shell.
* find -name "*.pdf" 
* Sucht im aktuellen Verzeichnis nach PDF-Dateien. ''-name'' berücksichtigt die Groß-/Kleinschreibung bei der Suche, findet also mit obigen Beispiel keine Datei(en) mit Endung '''*.PDF</nowiki>'''.
* Das ''*</nowiki>'' steht für eine beliebige Anzahl Zeichen.
* find -iname "a*.pdf" 
* Sucht im aktuellen Verzeichnis nach '''.pdf'''- und '''.PDF'''-Dateien, die mit ''a'' oder ''A'' beginnen.  find -name "katze.*" 
* findet '''katze.jpg''', '''katze.png''', '''katze.txt''' und so weiter  find -name "katze.??g" 
* findet '''katze.jpg''', '''katze.png''' und so weiter Jedes Fragezeichen steht für ein einzelnes Zeichen.
* find -name "*foo*.*x*" 
* findet '''foo.x''', '''afoo.x''', '''foob.txt''' und so weiter
 
==== -name <Muster> ====
Finde Dateien, deren Name ''<Muster>'' entspricht.
* Mit dieser Option wird ''<Muster>'' wie ein Suchmuster behandelt (siehe Kapitel [http://www.murnauer.de/mandrakeref/glob-regex.html Suchmuster und Reguläre Ausdrücke]).
 
==== -iname <Muster> ====
Findet Dateien mit Name, wie ''-name'', ignoriert jedoch Groß- und Kleinschreibung.
 
====  -path Name ====
Findet Dateien mit Name, wobei Name auch Pfadangaben enthalten kann ("*/include/*.h")
* Sucht man mit Verzeichnisnamen, in denen ein Schrägstrich '/' vorkommt, kommt man mit '-name' nicht weiter.
* Der Parameter '-path' ist hier die Lösung, denn er erlaubt die Interpretation des Zeichens '/'.  find -path "*2013/J*"
* findet '''~/fotos/2013/Juni''' und '''~/musik/2013/Juli''', aber nicht '''~/dokumente/2013-Juni'''
 
====  Reguläre Ausdrücke ====
''find'' hat nicht nur einfach RegEx-Support, es beherrscht auch mehrere unterschiedliche Arten der RegEx-Syntax.
* Mit ''-regextype'' und eine der unterstützten Arten wie ''posix-awk'', ''posix-egrep'', kannst du den Typ wählen.
* Lies unter ''man find'' nach, welche Arten unterstüzt werden.
* Ein kurze Beispiel.
* Sagen wir ich suche alle Dateien die entweder eine .php oder .js Endung.
* Ich könnte das folgende laufen lassen:
* find -regextype posix-egrep -regex '.*(php|js)$'* die egrep-Syntax ''-regextype posix-egrep'' zu benutzen und hinten kommt der Reguläre Ausdruck nach dem gesucht wird.
* Der Ausdruck beginnt und endet mit einem Hochkomma, damit die Shell nicht versucht die RegEx auszuwerten.
* Der Ausdruck ''.*'' ist ein Joker und bedeute „ein oder mehr beliebige Zeichen“. ''(php|js)'' weist an nach ''php'' oder ''js'' zu suchen.
* Die Pipe (|) steht hier für "oder".
* Das Dollarzeichen "$" hinten weist an, den Ausdruck am Ende eines Strings zu suchen.
* Also trifft etwa eine Datei namens ''js.txt'' nicht auf die Abfrage zu.
 
=====  -regex Muster =====
Wie "-name", nur kann das Muster reguläre Ausdrücke enthalten
 
=====  -regex Muster  =====
der Pfadname passt zu dem regulären Ausdruck Muster
 
===== -regex <Muster>:  =====
Wie ''-name'', jedoch wird hier ''Muster'' als re­gulärer Ausdruck behandelt.
 
=====  -iregex Muster =====
Wie „-regex“ jedoch ohne Groß-/keinschreibung zu beachten
 
===== -iregex <Muster>:  =====
Wie ''-regex'', ignoriert aber Groß- und Kleinschreibung.
 
=====  -regextype type =====
Ändert die Syntax der regulären Ausdrücke, die von -regex und -iregex verstanden werden.
* Folgende Typen sind implementiert: emacs (Standard), posix-awk, posix-basic, posix-egrep und posix-extende
 
===  Dateitypen ===
====  -type C  ====
die Datei ist vom Typ C; folgende Typen werden unterschieden:
* b gepufferte Gerätedatei für ein blockorientiertes Gerät
* c ungepufferte Gerätedatei für ein zeichenorientiertes Gerät
* d Verzeichnis
* p benannte Pipeline (FiFo)
* f normale Datei
* l symbolischer Link
* s Socket
 
Suche nach einem bestimmten Dateityp.
''<Typ>'' kann folgende Werte annehmen: ''f'' (reguläre Datei), ''d'' (Verzeichnis), ''l'' (symbolischer Verweis), ''s'' (Socket), ''b'' (Blockdatei), ''c'' (Zeichendatei) oder ''p'' (benannte Umleitung).


{|| class="wikitable sortable"  
=== Optionen ===
|-
{| class="wikitable sortable options"
|  | b
|  |
|-
|-
|  | c
! Option !! Parameter !! Beschreibung
|  |
|-
|-
| | d
| -H || ||  
| |  
|-
|-
| | p
| -L || ||  
| |  
|-
|-
| | f
| -P || ||  
| |  
|-
|-
|  | l
| -D || Fehlersuchoptionen ||  
|  |
|-
| | s
| |  
 
|-
|-
| -O || Stufe ||
|}
|}


===== Finde nur Dateien  =====
{| class="wikitable sortable options"
$ '''find -type f'''
* Das ''f'' steht für 'files'.
* Findet keine Verzeichnisse, aber alle herkömmlichen Dateien in allen Unterverzeichnissen.
 
===== Finde nur Verzeichnisse  =====
$ '''find -type d '''
* Das ''d'' steht für 'directories'.
* Findet alle Unterverzeichnisse, aber keine sonstigen Dateien.
 
====  -xtype C  ====
das gleiche wie -type für alle Dateien, die keine symbolischen Links sind
* wenn die Datei ein symbolischer Link ist und die Option -follow nicht gesetzt ist, wird die Datei, auf die der Link zeigt, auf den Typ C geprüft
* wenn die Option -follow gesetzt ist, ist der Test wahr, wenn C = l ist
 
===  Datum/Zeit ===
 
'''find''' hat eine Vielzahl von Optionen mit deren Hilfe man Dateien finden kann, darunter auch einige mit denen Dateien nach den 3 Zeitstempeln gesucht werden können.
* Im folgenden ein Auszug aus der [http://man.splitbrain.org/find ManPage von find] der diese Optionen beschreibt.
 
{| class="wikitable sortable"
|-
|-
| | '''-amin''' ''N''
! Option !! Beschreibung
| | auf die Datei ist vor '''''N''''' Minuten zugegriffen worden
|-
|-
| | '''-anewer''' ''Referenzdatei''
| -name || Sucht Dateien nach Dateinamen
| | auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der '''''Referenzdatei''''' vergangen ist
|-
|-
| | '''-atime''' ''N''
| -iname || Sucht nach Dateinamen und ignoriert Groß- und Kleinschreibung
| | auf die Datei ist vor '''''N*24''''' Stunden zugegriffen worden
|-
|-
| | '''-cmin''' ''N''
| -size || Sucht Dateien, die größer oder kleiner als größer sind
| | der Status der Datei wurde vor '''''N''''' Minuten geändert
|-
|-
| | '''-cnewer''' ''Referenzdatei''
| -type || Sucht Dateien eines bestimmten Typs
| | der Status der Datei wurde vor weniger Zeit verändert, als seit der letzten Veränderung der '''''Referenzdatei''''' vergangen ist
|-
|-
| | '''-ctime''' ''N''
| -atime || Sucht Dateien, auf die seit mehr oder weniger als X Tagen nicht mehr zugegriffen wurde
| | der Dateistatus wurde vor '''''N*24''''' Stunden geändert
|-
|-
| | '''-mmin''' ''N''
| -amin || Sucht Dateien, auf die seit mehr oder weniger als X Minuten nicht mehr zugegriffen wurde
| | der Inhalt der Datei wurde vor '''''N''''' Minuten verändert
|-
|-
| | '''-mtime''' ''N''
| -mtime || Sucht Dateien, die seit mehr oder weniger als X Tagen nicht mehr verändert wurden
| | der Inhalt der Datei wurde vor '''''N*24''''' Stunden verändert  
|-
|-
| | '''-newer''' ''Referenzdatei''
| -mmin || Sucht Dateien, die seit mehr oder weniger als X Minuten nicht mehr verändert wurden
| | die Datei ist später verändert worden als die '''''Referenzdatei'''''
|-
|-
|}
| -perm || Sucht Dateien nach Zugriffsrechten
dabei können die numerischen Argumente '''N''' auf drei Arten angegeben werden:
 
{| class="wikitable sortable" 
|-
| align=center | '''+ N'''
| align=center | wird interpretiert "alle Zahlen größer als N"
|-
|-
| align=center | '''- N'''
| -user || Sucht Dateien des Benutzers Benutzername
| align=center | wird interpretiert "alle Zahlen kleiner als N"
|-
| align=center | '''N'''
| align=center | wird interpretiert "genau N"
 
|-
|-
| -inode || Sucht Dateien nach [[Inode]]
|}
|}


'''Beispiele'''
{| class="wikitable sortable options"
$ find /tmp&nbsp;! -type d -atime +20 -user USER1 2>/dev/null
findet unterhalb /tmp alle Dateien die kein Verzeichnis sind und seit über 20 Tagen nicht mehr angefasst wurden und dem Benutzer USER1 gehören
 
$ find /home/USER1 -type f -mmin -20 -user USER1
findet alle normalen Dateien unterhalb vom Homeverzeichnis von USER1 die innerhalb der letzten 20 Minuten geändert wurden und dem User USER1 gehören
 
$ find /etc -cnewer /etc/fstab 2>/dev/null
findet alle Dateien unterhalb /etc deren ctime nach der letzten Änderung (mtime) der /etc/fstab geändert wurde
 
 
==== Zeitstempel von Dateien ====
siehe [[Linux:Dateien:Zeitstempel]]
 
====  Tage ====
$ find -mtime -365
* Sucht nach Dateien, deren Inhalt innerhalb der letzten 365 Tage geändert wurde (''mtime'' = modification time).
* Weitere Optionen sind * ''ctime'' (change time): Zeitpunkt, an dem der Status der Datei geändert wurde (Name, Rechte)
* ''atime'' (access time): Zeitpunkt an dem auf die Datei zugegriffen wurde.
* Ein Dateilisting selbst ist damit nicht gemeint.
* Bei Bilddateien zählt die Vorschaufunktion eines grafischen Dateimanagers aber bereits als Zugriff.
* Auch hier gibt es, ähnlich wie bei der [http://wiki.ubuntuusers.de/find#Nach-Dateigroesse-suchen Größe], Mindestalter (''+''), Höchstalter (''-'') und genaues Alter.
 
====  -newer Referenzdatei  ====
die Datei ist später verändert worden als die Referenzdatei; zusammen mit -follow tritt -newer nur in Effekt, wenn -follow vor -newer in der Kommandozeile steht
 
====  -used N  ====
auf die Datei ist N Tage nach der letzten Änderung zugegriffen worden
 
====  -atime Tage ====
Findet Dateien, auf die vor Tagen zugegriffen wurden (zur Angabe von Bereichen siehe Option "amin")
 
==== -atime <n>, -amin <n> ====
Finde Dateien, auf die zuletzt vor ''<n>'' Tagen (''-atime'') oder ''<n>'' Minuten (''-amin'') zugegriffen wurde.
* Sie können auch ''+<n>'' oder ''-<n>'' spezifizieren.
* Dann wird nach Dateien gesucht, auf die vor höchstens, oder mindestens ''<n>'' Tagen, oder Minuten zugegriffen wurde.
 
====  -atime N  ====
auf die Datei ist vor N*24 Stunden zugegriffen worden
 
====  -anewer Referenzdatei  ====
auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der Referenzdatei vergangen ist; im Zusammenhang mit -follow tritt -anewer nur in Effekt, wenn -follow vor -anewer in der Kommandozeile steht
 
==== -anewer <Datei> ====
Findet Dateien auf die später zugegriffen wurde als auf Datei ''<Datei>''
 
====  -amin Minuten ====
Findet Dateien, auf die vor Minuten zugegriffen wurden.
* Um bspw.
* alle Dateien zu finden, deren Zugriff vor 2 bis 8 Minuten geschah, können die Angaben kombiniert werden: "-amin +2 -amin -8".
 
====  -amin N  ====
auf die Datei ist vor N Minuten zugegriffen worden
 
==== Minuten  ====
Sometimes you need to look for files modified in the last day or so, and the previous options are a bit too broad for that.
* The good news is that ''find'' also has the '''-amin''', '''-cmin''', and '''-mmin''', which are similar to the other options but they work with minutes rather than days.
* So if you want to look for something that was changed or accessed in the last day, you can use those options.
* find -amin -5
* nach Dateien suchen, auf die in den letzten 5 Minuten zugegriffen wurde.
* Analog: ''-cmin'', ''-mmin''.
 
====  Alle Dateien, auf die in der letzten Minute zugegriffen wurde ====
Um die nachfolgende Suche erfolgreich enden zu lassen, manipulieren wir mit Hilfe von "touch" die Zugriffszeiten einiger Dateien '''touch sax* find . -amin 1 .''' ./saxsys.tgz ./sax_logo.gif
 
==== -ctime <n>, -cmin <n>, -cnewer <Datei> ====
Genau wie ''-atime'', ''-amin'' und ''-anewer'', doch in Bezug auf die letzte Inhaltsänderung der Datei.
 
====  -ctime N  ====
der Dateistatus wurde vor N*24 Stunden geändert
 
====  -cmin N  ====
der Status der Datei wurde vor N Minuten geändert
 
====  -cnewer Referenzdatei  ====
der Status der Datei wurde vor weniger Zeit verändert, als seit der letzten Veränderung der Referenzdatei vergangen ist; zusammen mit -follow tritt -cnewer nur in Effekt, wenn -follow vor -cnewer in der Kommandozeile steht
 
'''Vergleich'''
$ find -cnewer /tmp/referenz
* Nach Dateien suchen, die nach der Referenzdatei geändert wurden.
* Mit ''touch --date='15:00' /tmp/referenz'' erstellt man sich eine Referenzdatei, wenn man keine hat.
 
====  -mtime Tage ====
Findet Dateien, die vor Tagen geändert wurden (zur Angabe von Bereichen siehe Option »amin«)
 
====  -mtime N  ====
der Inhalt der Datei wurde vor IN*24 Stunden verändert
 
====  -mmin N  ====
der Inhalt der Datei wurde vor N Minuten verändert
 
====  -daystart  ====
mißt die Zeiten für die -amin, -atime, -cmin, -ctime, -mmin und -mtime Eigenschaften vom Beginn des aktuellen Tages anstelle der letzten 24 Stunden.
* Diese Option betrifft nur die Tests, die weiter hinten in der Kommandozeile geschrieben sind.
* Werden zeit-bezogene Tests durchgeführt (siehe unten), wird der Beginn des aktuellen Tages als Zeitstempel genommen (und nicht der Zeitpunkt vor 24 Stunden, was der Standard-Einstellung entspricht).
 
===  Größ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 [http://wiki.ubuntuusers.de/wc 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
 
===  Zugriffsrechte ===
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 Bits zu ignorieren.
* Das heißt, es spielt keine Rolle, wenn die Datei auch beschreibbar oder lesbar ist, solange die Bits 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 filesystem's ''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 isn't 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.
 
{|| class="wikitable sortable" class="wikitable sortable"
|-
|  | '''( 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.
 
==  Aktionen  ==
===  -ls  ===
zeigt das Verzeichnis in dem die getestete Datei gefunden wurde mit ls -dils an
 
===  -delete  ===
Löscht die gefundenen Dateien
 
====  Achtung! ====
Da find auch Unterverzeichnisse durchsucht, sollte mit dieser Option vorsichtig umgegangen werden.
* Mit find gelöschte Dateien landen nicht im Papierkorb und können nicht wieder hergestellt werden.
* Siehe auch [http://wiki.ubuntuusers.de/find#Die-Aktion-delete-steht-an-der-falschen-Stelle Die Aktion -delete steht an der falschen Stelle]
* Vor der Verwendung sollte ein Test ohne ''-delete'' voraus gehen, um sicher zu gehen, nicht zu viele Dateien zu löschen.
* Die ''-delete''-Option impliziert ''-depth'', das heißt, man muss zum Testen auch ''-depth'' setzen, um keine Überraschung zu erleben.
* Es ist auch sorgfältig darauf zu achten, an welcher Position ''-delete'' steht.  find test/ -name "c*" -delete 
* Löscht im Verzeichnis '''test''' und dessen Unterverzeichnissen alle Dateien, die mit "c" beginnen.
* Der Befehl löscht auch Verzeichnisse selbst, die mit "c" beginnen, diese jedoch nur, wenn sie leer sind, wie allgemein üblich bei Linux.
* Das ist der Grund, weshalb ''-delete'' ein ''-depth'' impliziert:
* Wenn erst in den Unterverzeichnissen gelöscht wird kann ein leeres Oberverzeichnis auch gelöscht werden, umgekehrt nicht.
 
===  Find und anderen Kommandos  ===
Now that you've found the files you're looking for, what are you going to do with them?
* You can use ''find'' in conjunction with '''xargs''' or the '''-exec''' option to manipulate files after you've found what you're looking for.
* Say you want to change the ownership of a bunch of files from root to www-data.
* Finding all the files is only the first step; you also need to change the ownership.
* Doing it manually from a list of files returned by ''find'' sounds like tedium, and it is.
* So you might want to use the '''-exec''' option to change the ownership:
 
find -user root -exec chown www-data {} \;
* That command tells find to pass all the files it finds to the '''chown''' utility and change the ownership to '''www-data'''.
* Piece of cake.
 
====  Dateien bearbeiten ====
Schließlich wünscht man sich, mit der gefundenen Datei etwas anstellen zu können, das heißt, die gefundene Datei durch ein Kommando zu schleusen.
* Mit der Option -exec Kommando(s) {} ; wird in jedem Schritt die gefundene Datei der Reihe nach mit den angegebenen Kommandos bearbeitet.
* Die geschweiften Klammern dienen dabei als Platzhalter, der den aktuellen Dateinamen enthält.
* Das Semikolon schließt die exec-Option ab:
 
'''Suche nach leeren Dateien und zeige diese mittels "ls -l" an'''
$ find ./bsp/ -empty -exec ls -l \{\} \; 
insgesamt 0  insgesamt 0 
-rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/bla/file 
-rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/foo/file
 
'''Bemerkung'''
* Die Maskierung der geschweiften Klammern und des Semikolons ist entscheidend, da diese sonst von der Shell substituiert werden (ein Semikolon wird bspw.
* entfernt).
* Auch muss zwischen schließender Klammer und Semikolon ein Leerzeichen stehen!
 
==== -exec Kommando {} \;  ====
Wendet auf alle gefundenen Dateien den Shellbefehl "Kommando" an. {} steht dabei als Platzhalter für die gefundenen Dateinamen.
* Das Zeichen ; terminiert den von find aufzurufenden Shellbefehl, damit es nicht unbeabsichtigt von der Shell interpretiert wird muss es mit \ maskiert werden.
 
====  -exec Kommando; << ====
führt das Kommando aus; die Aktion ist wahr, wenn das Kommando einen Status von Null liefert; alle auf den Kommandonamen folgenden Argumente bis zu einem Semikolon.
* werden als Kommandozeilenargumente für das Kommando interpretiert.
* das Semikolon kann nicht weggelassen werden, und es muss durch mindestens ein Whitespace von der letzten Option getrennt werden
* die Konstruktion {} wird durch den Pfadnamen der Datei ersetzt; die Klammern und das Semikolon müssen in der Kommandozeile für find quotiert werden, damit sie nicht von der Shell bearbeitet werden
 
====  Using ‑exec Efficiently ====
The ''‑exec'' action takes a command (along with its options) as an argument.
* The arguments should contain ''{}'' (usually quoted), which is replaced in the command with the name of the currently found file.
* The command is terminated by a semicolon, which must be quoted (“escaped”) so the shell will pass it literally to the ''find'' command.
* To use a more complex action with ''‑exec'', you can use “''complex-command''” as the Unix command.
* Here's a somewhat contrived example, that for each found file replaces “Mr.” with “Mr.
* or Ms.”, and also converts the file to uppercase:  find ''whatever...'' -exec sh -c 'sed "s/Mr\./Mr.
* or Ms./g" "{}" \'      | tr "[:lower:]" "[:upper:]" >"{}.new"' \;
* The ''‑exec'' action in ''find'' is very useful.  But since it runs the command listed for every found file, it isn't very efficient.
* On a large system this makes a difference!  One solution is to combine ''find'' with ''xargs'' as discussed [http://content.hccfl.edu/pollock/Unix/FindCmd.htm#xargs above]:  find ''whatever...'' | xargs ''command''
* However this approach has two limitations.  Firstly not all commands accept the list of files at the end of the command.  A good example is ''cp'':  find . -name \*.txt | xargs cp /tmp  # This won't work!</nowiki>
 
(Note the Gnu version of ''cp'' has a non-POSIX option “''‑t''” for this, and Gnu ''xargs'' has options to handle this too.)
* Secondly, filenames may contain spaces or newlines, which would confuse the command used with ''xargs''.  (Again Gnu tools have options for that, “''find ... ‑print0 | xargs ‑0 ...''”.)
* There are standard POSIX (but non-obvious) solutions to both problems. 
* An alternate form of ''‑exec'' ends with a plus-sign, not a semi-colon.  This form collects the filenames into groups or sets, and runs the command once per set. 
* This is exactly what ''xargs'' does, to prevent argument lists from becoming too long for the system to handle.
* In this form, the ''{}'' argument expands to the set of filenames. 
* For example:
find / -name core -exec /bin/rm -f '{}' +
 
==== -execdir Kommando {} +  ====
Wendet auf alle gefundenen Dateien den Shellbefehl "Kommando" an.
* Im Ggs.
* zu ''-exec'' wird das Kommando im Verzeichnis, in dem die Datei liegt, ausgeführt.
* Das Plus statt des ''\;'' am Ende provoziert die parallele Ausführung der Kommandos, und kann auch bei -exec verwendet werden
 
===== Mehrere Kommandos ausführen =====
As for the ''find'' command, you can also just add more ''-exec'' commands in a row:
$ find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
 
* Note that this command is, in its result, equivalent of using  chgrp -v new_group file '''&&''' chmod -v 770 file on each file.
* All the ''find'''s parameters such as ''-name'', ''-exec'', ''-size'' and so on, are actually '''tests''': ''find'' will continue to run them one by one as long as the entire chain so far has evaluated to ''true''.
* So each consecutive ''-exec'' command is executed '''only if''' the previous ones returned ''true'' (i.e. ''0'' exit status of the commands).
* But ''find'' also understands logic operators such as ''or'' (''-o'') and ''not'' (''!'').
* Therefore, to use a chain of ''-exec'' tests '''regardless''' of the previous results, one would need to use something like this:
$ find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
 
@user Unfortunately, I don't know if it is still necessary.
* I did some test just now and haven't come across a situation where it would change anything.
* I guess it's just "good practice" that will die out. – [http://unix.stackexchange.com/users/9382/rozcietrzewiacz rozcietrzewiacz] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment24573_18085 Aug 5 '11 at 8:04]
$ find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;
 
@Gilles: The wonders of ''-c'''s odd handling of $0 make me think this is wrong every time I glance at it, but its definitely correct.
– [http://unix.stackexchange.com/users/977/derobert derobert] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment64156_18078 Aug 24 '12 at 16:52]
* I like the explicit shell being defined... – [http://unix.stackexchange.com/users/7586/djangofan djangofan] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment64180_18078 Aug 24 '12 at 19:05]
 
==== -ok ====
Anstatt ''-exec'' kann man auch ''-ok'' verwenden.
* Hierbei wird jedes mal gefragt, ob man die Aktion ausführen möchte.
* Meist empfiehlt sich ''-execdir'' statt ''-exec''  find test -type d -exec tar -cjf archiv.bz2 {} \;
 
''-execdir'' führt das Kommando aus dem Verzeichnis heraus aus, in dem die Datei gefunden wird.
* So wird also für jedes Unterverzeichnis ein '''archiv.bz2''' vor Ort angelegt.
* Mit einem einfachen ''-exec'' würde für jedes Verzeichnis ein Archiv im aktuellen Verzeichnis angelegt, das heißt, das Archiv immer wieder überschrieben, so dass am Ende nur ein Archiv mit den Ergebnissen des letzten Verzeichnisses existiert.
 
=====  -ok Kommando;  =====
wie -exec, vor der Ausführung des Kommandos wird aber noch eine Bestätigung erwartet; nur eine Eingabe, die mit einem B oder einem y beginnt, führt zur Ausführung des Kommandos
 
===== -ok Kommando {} \;  =====
Wie ''-exec'', allerdings wird vor jeder Aktion eine Bestätigung erfragt. {} steht dabei als Platzhalter für die gefundenen Dateinamen
 
==== -okdir  ====
find -name "*pdf" -okdir xpdf {} \;
 
''-okdir'' fragt im Gegensatz zu ''-execdir'' vor jeder Datei nach, ob man wirklich die Aktion ausführen möchte.
 
===== Parallele Ausführung mit +  =====
find -name "*pdf" -execdir md5sum {} + 
* Beendet man ein Kommando mit Plus ''+'' statt mit Semikolon '';</nowiki>'', so werden mehrere, gegebenenfalls alle Funde auf einen Rutsch an das Kommando übergeben.
* Dies ist dann sinnvoll, wenn das Kommando selbst mit mehreren Parametern zurechtkommt.
* Beispiele:  find test -type f -execdir md5sum {} ";"
* ergibt: md5sum a md5sum b md5sum c
* Dagegen ergibt:  find test -type f -execdir md5sum {} +  md5sum a b c
* Das + kann nur verwendet werden, wenn die geschweiften Klammern unmittelbar davor stehen.
* Eine etwas heikle Angelegenheit ist das Löschen mit der Option ''-delete''.
 
===== -okdir Kommando {} +  =====
Wie eine Kombination von ''-ok'' und ''-execdir'', das heißt, es wird eine Bestätigung erfragt, und das Kommando wird im Fundordner ausgeführt.
* Das Plus kann statt ";" verwendet werden, wenn die ''{}'' der letzte Parameter sind; dann werden mehrere Funde auf einmal an ''Kommando'' übergeben.
 
==  Ausgabe formatieren ==
===  -print  ===
gibt den vollständigen Pfadnamen der getesteten Datei auf die Standardausgabe
 
===  -fprint Ausgabedatei  ===
schreibt den Pfadnamen der getesteten Datei in die Ausgabedatei; wenn die Ausgabedatei nicht existiert, wird sie erzeugt, sonst wird sie erweitert; die Standardausgabe und die Standardfehlerausgabe werden als /dev/stdout und /dev/stderr angesprochen
 
==== -fprint Datei  ====
Gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei "Datei"
 
===  -print0  ===
gibt den Pfadnamen der getesteten Datei, von einem Nullbyte abgeschlossen, auf die Standardausgabe; auf diese Weise können auch Pfadnamen korrekt weiterverarbeitet werden, die ein Zeilenende enthalten
 
====  -fprint0 Ausgabedatei  ====
schreibt den Namen der getesteten Datei in die Ausgabedatei und schließt die Ausgabe mit einem Nullbyte ab, wie -print0
 
===  -printf ===
Using the (non-standard) “''‑printf''” action instead of the default “''‑print''” is useful to control the output format better than you can with the ''ls'' or ''dir'' utilities.
* You can use ''find'' with the ''‑printf'' action to produce output that can easily be parsed by other utilities or imported into spreadsheets or databases.
* See the Gnu ''find'' man page for the dozens of possibilities with the ''‑printf'' action.
* In fact, ''find'' with ''‑printf'' is more versatile than ''ls''; it is the preferred tool for forensic examiners even on Windows systems, to list file information.</nowiki>
* For example the following displays non-hidden (no leading dot) files in the current directory only (no subdirectories), with an custom output format:  find . -maxdepth 1 -name '[!.]*' -printf 'Name: %16f Size: %6s\n'
 
“''‑maxdepth''” is a Gnu extension.
* On a modern, POSIX version of ''find'' you could use this:  find . -path './*' -prune ...
* On any version of ''find'' you can use this more complex (but portable) code:  find . ! -name . -prune ...
* which says to “prune” (don't descend into) any directories except “''.''”.
* Note that “''‑maxdepth 1''” will include “''.''” unless you also specify “''‑mindepth 1''”.
* A portable way to include “''.''” is:  find . \( -name . -o -prune \) ...
* The “''\(''” and “''\)''” are just parenthesis used for grouping, and escaped from the shell.
* The “''‑o''” means Boolean ''OR''.
* As a system administrator, you can use ''find'' to locate suspicious files (e.g., world writable files, files with no valid owner and/or group, Set files, files with unusual permissions, sizes, names, or dates).
* Here's a more complex example (which I saved as a shell script so I can run it often):  find / -noleaf -wholename '/proc' -prune \      -o -wholename '/sys' -prune \      -o -wholename '/dev' -prune \      -o -wholename '/windows-C-Drive' -prune \      -o -perm -2 ! -type l  ! -type s \      ! \( -type d -perm -1000 \) -print
* This says to seach the whole system, skipping the directories ''/proc'', ''/sys'', ''/dev'', and ''/windows-C-Drive'' (presumably a Windows partition on a dual-booted computer).
* The Gnu ''‑noleaf'' option tells ''find'' not to assume all remaining mounted filesystems are Unix file systems (you might have a mounted CD for instance).
* The “''‑o''” is the Boolean OR operator, and “''!''” is the Boolean NOT operator (applies to the following criteria).
* So these criteria say to locate files that are world writable (“''‑perm ‑2''”, same as “''‑o=w''”) and NOT symlinks (“''! ‑type l''”) and NOT ''sockets'' (“''! ‑type s''”) and NOT directories with the ''sticky'' (or ''text'') bit set (“''! \( ‑type d ‑perm ‑1000 \)''”).
 
(Symlinks, sockets, and directories with the sticky bit set, are often world-writable and generally not suspicious.)
 
====  -printf Format  ====
gibt für die getestete Datei die Zeichenkette Format auf der Standardausgabe aus; Format kann verschiedene Sonderzeichen und Platzhalter enthalten, die von find bearbeitet werden:
 
\aAlarmton \bRückschritt \cAbbruch der Ausgabe \fSeitenvorschub \nZeilenvorschub \rWagenrücklauf \thorizontaler Tabulator \vvertikaler Tabulator \\der Backslash selbst
* ein Backspace gefolgt von irgendeinem anderen Zeichen wird als normales Zeichen interpretiert und einfach ausgegeben
 
%% das Prozentzeichen selbst %a die Zeit des letzten Zugriffs auf die Datei, in dem Format der ctime Funktion %A k die Zeit des letzten Zugriffs auf die Datei, in dem von k bestimmte Format; k hat dabei das gleiche Format wie der entsprechende Parameter der strftime Funktion in C:
 
@ Sekunden seit dem 1.1.1970 0 Uhr GMT H Stunde (00 bis 23) I Stunde (01 bis 12) k Stunde (0 bis 23) l Stunde (1 bis 12) M Minute (00 bis 59) p PM oder AM r Zeit, 12 Stunden (hh:mm:ss: AM/PM) S Sekunden (00 bis 61) T Zeit, 24 Stunden (hh:mm:ss) X Zeit (H:M:S) Z Zeitzone, oder nichts a abgekürzter Wochentag A ausgeschriebener Wochentag b abgekürzter Monatsname B ausgeschriebener Monatsname c Datum und Zeit d Tag im Monat D Datum (mm/dd/yy) h das gleiche wie b j der Tag im Jahr m die Zahl des Monats U die Nummer der Woche, Sonntag als erster Wochentag w die Zahl des Wochentags W die Nummer der Woche, Montag als erster Wochentag x Datum (mm/dd/yy) y die letzten beiden Stellen der Jahreszahl Y die Jahreszahl
 
%b die Dateigröße in 512 Byte Blöcken (aufgerundet) %c das Datum der letzten Statusänderung im Format der C ctime Funktion %Ck das Datum der letzten Statusänderung im Format der BR strftime " Funktion; Parameter wie oben" %d die Höhe der Datei im Verzeichnisbaum; Null bedeutet, dass die Datei Kommandozeilenargument ist
 
%f der Name der getesteten Datei, ohne Verzeichnisse
 
%g der Gruppenname der getesteten Datei oder die Kennzahl, wenn die Gruppe nicht eingetragen ist
 
%G die Gruppenkennzahl
 
%h die Verzeichnisnamen des Pfadnamen der getesteten Datei
 
%H das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
 
%i die Nummer der Inode der getesteten Datei
 
%k die aufgerundete Größe der getesteten Datei in Kilobytes
 
%l das Objekt, auf die ein symbolischer Link zeigt; leer, wenn die getestete Datei kein symbolischer Link ist
 
%m die Zugriffsrechte als Oktalzahl
 
%n die Anzahl der harten Links auf die getestete Datei
 
%p der Pfadname der Datei
 
%P der Pfadname und das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
 
%s die Größe der getesteten Datei in Bytes
 
%t die Zeit der letzten Änderung, im ctime Format
 
%Tk die Zeit der letzten Änderung, im strftime Format (siehe oben)
 
%u der Name des Eigentümers der getesteten Datei oder die Kennzahl, wenn der Benutzer nicht eingetragen ist
 
%U die Benutzerkennzahl des Eigentümers der getesteten Datei
 
====  -fprintf Ausgabedatei Format  ====
schreibt den Namen der getesteten Datei in die Ausgabedatei und benutzt dabei das Format mit Sonderzeichen wie bei printf
 
===  -prune  ===
Wenn die Datei ein Verzeichnis ist, wird nicht in dieses hinabgestiegen. * wahr, wenn die Option -depth nicht angegeben ist
* falsch, wenn die Option -depth angegeben ist, hat keine Auswirkungen.
 
===  Beispiele  ===
Ohne weitere Angaben gibt find die Namen der gefundenen Dateien aus:  find /boot/grub/ -name "he*"  /boot/grub/hexdump.mod  /boot/grub/hello.mod  /boot/grub/help.mod 
* Wie bereits gesehen kann man mit ''-ls'' eine detailliertere Ausgabe erzeugen:  find /boot/grub/ -name "he*" -ls  168624    4 -rw-r--r--  1 root    root        3196 Jan 13 17:08 /boot/grub/hexdump.mod  168603    4 -rw-r--r--  1 root    root        1308 Jan 13 17:08 /boot/grub/hello.mod  168623    4 -rw-r--r--  1 root    root        2200 Jan 13 17:08 /boot/grub/help.mod
* Mit ''-exec'' und dessen Varianten lassen sich beliebige Programme auf den Fundstellen ausführen.
* Die Anzahl der Zeilen in Textdateien findet man mit ''wc -l DATEI''; kombiniert mit find sieht das so aus: </nowiki>
find -name "*.py" -exec wc -l {} \;  10 ./x/abc.py 6 ./x/date-form.py 102 ./x/download.py
* Das Kommando ''wc -l'' (Anzahl der Zeilen zählen) wird auf jede gefundene Datei angewendet.
* Die geschweiften Klammern werden durch die von find gefundenen Namen ersetzt.
* Am Ende muss der ganze Befehl mit einem Semikolon abgeschlossen werden.
* Damit das Semikolon nicht von der Shell interpretiert wird, muss man es mit einem Backslash oder Anführungsstrichen maskieren.
* Kombination mit ''-print''  find tmp -name "a" -exec touch {} \; -print  ./tmp/a  ./tmp/a/a  ./tmp/a/a/a
 
''touch'' setzt das Datum der Dateien auf den Ausführungszeitpunkt.
* Da touch aber nicht den Dateinamen ausgibt sieht man nicht, welche Dateien nun betroffen waren.
* Daher schickt man ein ''-print'' hinterher.
 
= Dokumentation =
== Man-Pages ==
== Info-Pages ==
= Links =
== Intern ==
# [[Linux:Befehl:xargs]]
 
== Weblinks ==
== Kontrollfragen ==
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
 
= Installation =
= Syntax =
== Parameter ==
== Optionen ==
= Konfiguration =
== Dateien ==
= Anwendungen =
find - sucht in einer Verzeichnishierarchie nach Dateien 
 
$ '''find [-H] [-L] [-P] [Verzeichnis...] [Ausdruck]'''
* GNU find durchsucht eine oder mehrere Verzeichnishierarchien und bewertet dabei den Ausdruck von links nach rechts entsprechend den Regeln der Priorität (siehe Abschnitt OPERATOREN) bis das Ergebnis bekannt ist (die linke Seite ist falsch für UND Operatoren, wahr für ODER Operatoren).
* Anschließend führt find die Suche mit der nächsten Datei fort.
* Beginnen wir mit dem Grundlagen. Wenn du eine Datei suchst und kennst den Namen der Datei - nur nicht den Ort wo du sie abgelegt hast - dann ist die Syntax einfach. Lass <tt>find</tt> einfach nach dem speziellem Namen suchen: find -name filename
* Angenommen ''filename'' existiert, dann wird <tt>find</tt> den Speicherort der Datei/Dateien anzeigen.
* Wie etwa hier:
'''find -name filename'''  ./projects/filename
* find ist ein traditionelles Unix-Programm. Es dient zum rekursiven Suchen von Dateien nach bestimmten Kriterien in einem oder mehreren Verzeichnissen. Es ist wirklich nützlich, die Syntax verlangt allerdings etwas Übung: find [Optionen] [Verzeichnisse] [Kriterium] [Handlung]
* Geben Sie kein Verzeichnis an, durchsucht find das aktuelle Verzeichnis. Geben Sie das Kriterium nicht an, gilt sein Wert als ,,wahr`` und alle Dateien werden gefunden.
* Die Optionen, Kriterien und Aktionen sind so mannigfaltig, dass hier nur wenige erwähnt werden können.
* The <tt>find</tt> command is used to locate files on a Unix or Linux system. <tt>find</tt> will search any set of directories you specify for files that match the supplied ''search criteria''.
* You can search for files by name, owner, group, type, permissions, date, and other criteria. The search is recursive in that it will search all subdirectories too.&nbsp;
* The syntax looks like this:
* find ''where-to-look criteria what-to-do''
* All arguments to <tt>find</tt> are optional, and there are defaults for all parts.
* This may depend on which version of <tt>find</tt> is used. Here we discuss the freely available Gnu version of <tt>find</tt>, which is the version available on <tt>YborStudent</tt>.)
* For example, ''where-to-look'' defaults to <tt>.</tt>(that is, the current working directory), ''criteria'' defaults to none (that is, select all files), and ''what-to-do'' (known as the <tt>find</tt> ''action'') defaults to <tt>‑print</tt> (that is, display the names of found files to standard output).
* Technically, the criteria and actions are all known as <tt>find</tt> ''primaries''.
* For example:  find
* will display the pathnames of all files in the current directory and all subdirectories.&nbsp; The commands  find . -print  find -print  find .
* do the exact same thing.&nbsp; Here's an example <tt>find</tt> command using a search criterion and the default action:  find / -name foo
* This will search the whole system for any files named <tt>foo</tt> and display their pathnames.
* Here we are using the criterion <tt>‑name</tt> with the argument <tt>foo</tt> to tell <tt>find</tt> to perform a name search for the filename <tt>foo</tt>.&nbsp; The output might look like this:  /home/wpollock/foo  /home/ua02/foo  /tmp/foo
* If <tt>find</tt> doesn't locate any matching files, it produces no output. The above example said to search the whole system, by specifying the root directory (“<tt>/</tt>”) to search.
* If you don't run this command as root, <tt>find</tt> will display a error message for each directory on which you don't have read permission.
* This can be a lot of messages, and the matching files that are found may scroll right off your screen.
* A good way to deal with this problem is to redirect the error messages so you don't have to see them at all:  find / -name foo '''2>/dev/null'''
* You can specify as many places to search as you wish:  find /tmp /var/tmp . $HOME -name foo
 
===  Ausdrücke  ===
Ein Ausdruck besteht aus Optionen (welche das allgemeine Verhalten der Kommandos bestimmen und immer wahr zurückgeben), Tests (welche wahr oder falsch zurückgeben) und Aktionen (welche wahr oder falsch zurückgeben).
* Optionen, Tests und Aktionen werden über Operatoren verknüpft. Wenn kein Operator explizit angeben ist, wird der UND Operator -and verwendet.
* Wenn der Ausdruck keine andere Aktion als -prune enthält, wird mit allen Dateien, für welche der Ausdruck wahr ergibt, die Aktion -print durchgeführt.
 
===  Exit Status ===
Der Status von find ist Null, wenn alle Aktionen erfolgreich waren, im Fehlerfall ist der Status größer als Null.
 
===  Tests ===
Ein Kriterium kann einen oder mehrere atomare Tests umfassen.
 
====  -true  ====
ist immer wahr
 
====  -false  ====
ist immer falsch
 
===  Optionen ===
'''Sollten am Anfang des Ausdrucks stehen'''
* Alle Optionen geben immer logisch wahr zurück.
* Mit der Ausnahme von -follow und -daystart haben sie immer Auswirkungen und werden nicht erst dann verarbeitet, wenn ihre Position im Ausdruck erreicht wird.
* Daher sollten ist es für bessere Lesbarkeit besser, sie an den Anfang des Ausdrucks zu stellen.
* Eine Warnung wird ausgegeben, wenn Sie das nicht machen.
 
====  -noleaf  ====
erzwingt die Bearbeitung aller Verzeichniseinträge
* Normalerweise kann davon ausgegangen werden, dass jedes Linuxverzeichnis wenigstens zwei (harte) Links enthält: * das Verzeichnis . ist ein Link auf das Verzeichnis selbst, und jedes Unterverzeichnis enthält den Eintrag
* .. als Link auf das Oberverzeichnis
* Wenn find bei der Untersuchung eines Verzeichnisses zwei Unterverzeichnisse weniger untersucht hat, als das Verzeichnis Links zählt, kann deshalb normalerweise die weitere Suche beendet werden
 
====  Suche abbrechen ====
Es besteht aber die Möglichkeit, eine Suche abzubrechen, sobald im Verzeichnis- oder Dateinamen ein bestimmtes Textmuster enthalten ist.
* Dem jeweiligen Suchkriterium ("-name" oder "-path") ist die Option -prune hinten an zu stellen:
 
<nowiki># Anzeige alle Dateien "-print", deren Name nicht mit einem Punkt beginnt</nowiki> find . -path './.*' -prune -o -print . ./nsmail ./iglinux.tgz ./linuxbuch
 
===  Suchkriterien ===
Alle numerischen Argumente können auf drei Arten angegeben werden:
 
{| class="wikitable sortable"
|-
|  | '''+ N '''
|  | steht für alle Zahlen größer als N
|-
|  | '''- N '''
|  | steht für alle Zahlen kleiner als N
|-
|  | '''N '''
|  | steht für genau N
|-
|}
 
* Alle Tests werden auf die Dateien in den angegebenen Verzeichnissen einzeln angewendet.
* Die Tests liefern einen Wahrheitswert von 0 (Wahr), wenn der Test erfolgreich war.
* Die Tests auf die erweiterten Zeitmarken (Zugriff und Erstellung) werden nur in solchen Verzeichnissen korrekt behandelt, die auf einem der neuen Linuxdateisysteme angesiedelt sind (e2fs, xiafs, new minix).
* Auf den anderen Dateisystemen wird nur das Datum der letzten Änderung zuverlässig getestet.
* Das Ergebnis der anderen Tests hängt davon ab, ob der letzte Zugriff bzw. die letzte Änderung so kurz zurückliegen, dass die veränderte I-Node noch im Arbeitsspeicher (Cache) ist.
* Dann können auch für die Dateien der alten Dateisysteme alle drei Zeitmarken unterschieden werden.
 
===  Suchbereich ===
====  Startverzeichnis(se) ====
Suche nach allen Dateien und allen Unterverzeichnissen im aktuellen Verzeichnis:  find
* Suche nach allen Dateien und Verzeichnissen im Unterverzeichnis '''foo''' des aktuellen Verzeichnisses:  find foo
* Suche alle Dateien und Verzeichnisse im übergeordneten Verzeichnis:  find ../ 
* Suche in einem ganz anderen Verzeichnis beginnen (im absoluten Pfad '''/tmp'''):  find /tmp 
* Suche in zwei Verzeichnissen (sucht sowohl in '''/tmp''' als auch in '''/boot'''):  find /tmp /boot
* Suche überall (Sucht im Wurzelverzeichnis alle Dateien und alle Unterverzeichnisse - das kann dauern!):  find /
 
====  Verzeichnistiefe  ====
find -maxdepth 3
* steigt bei der Suche nur 3 Verzeichnisebenen herab.
 
=====  Limit Searches =====
Sometimes <tt>find</tt> provides more results than you need, or want. You can limit <tt>find</tt> results by using the '''-maxdepth''' option. For example, if you wanted to find every JavaScript file in your wordpress directory, you would use this: find wordpress -name '*js'
* But what if you only want to see if there are any JavaScript files in the top-level directory? You can limit that with '''-maxdepth''': find wordpress -maxdepth 1 -name '*js'   
* That will only search the '''wordpress''' directory, but not any of the subdirectories. Changing the '''-maxdepth''' to 2 would search subdirectories in the wordpress directory, but it would exclude their subdirectories.
 
=====  -depth  =====
bearbeitet den Inhalt jedes Verzeichnisses vor dem Verzeichnis selbst.
 
=====  -maxdepth Ebenen  =====
steigt bis zu der gegebenen Zahl von Ebenen im Verzeichnisbaum auf (in der Hierarchie ab); bei 0 Ebenen werden die Tests nur auf die in der Kommandozeile übergebenen Dateien und Verzeichnisnamen angewendet
 
===== -maxdepth <n> =====
Suche nach Dateien, die sich maximal n Verzeichnisebenen unter dem angegebenen Verzeichnis befinden.
 
=====  -mindepth Ebenen  =====
steigt mindestens die gegebene Zahl von Ebenen im Verzeichnisbaum auf (in der Hierarchie ab); bei einer Ebene werden die in der Kommandozeile genannten Dateien und Verzeichnisnamen nicht bearbeitet
 
===== -mindepth <n> =====
Gehe mindestens <n> Verzeichnisebenen unter das angegebene Verzeichnis zurück, bevor die Suche gestartet wird.
 
====  Verzeichnisse ausschließen ====
Use the prune switch, for example if you want to exclude the misc directory just add a -path ./misc -prune -o to your find command: find . -path ./misc -prune -o -name '*.txt' -print
* Here is an example with multiple directories: find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print find / \( -path /etc -o -path /dev -o -path /proc -o -path /sys \) -prune -o -name fstab -print
* Here we exclude dir1, dir2 and dir3, since in find expressions it is an action, that acts on the criteria -path dir1 -o -path dir2 -o -path dir3 (if dir1 or dir2 or dir3), ANDed with type -d. Further action is -o print, just print.* shouldn't find . -name ./misc ... be find . -path ./misc ...?
* Hmm. This doesn't work for me either as it will include the ignored directory "./misc" in the output.
* Try to use misc instead of ./misc, that worked for me
* It probably didn't work for you because you didn't add a -print (or any other action) explicitly after -name. In that case, both "sides" of -o end up printing, whereas if you use -print, only that side prints.
 
===== All answers using -prune are wrong. The right way is: =====
find -name "*.js" -not -path "./directory/*"* One of the comments in the accepted answer points out the problem. -prune does not exclude the directory itself, it exclude its content, which means you are going to get an unwanted line in the output with the excluded directory. –
* Great answer. I'd add to this that you can exclude a directory at ANY level by changing the first . to *. so find -name "*.js" -not -path "*/omitme/*" would omit files from a directory named "omitme" at any level of depth.
* It still traverses all of the unwanted directory, though. I'm adding my own answer. :-)
* Note, however, that the prune option only doesn't work if you don't use -print explicitly.
* It would be better to say "This is an alternative to using -prune". The answers suggesting -prune are clearly not wrong, they just aren't the way you would do it.
 
====  Umgang mit symbolischen Links ====
Die Optionen -H, -L und -P bestimmen den Umgang mit symbolischen Links* Darauf folgende Kommandozeilenparamter müssen die Datei- oder Verzeichnisnamen sein, die untersucht werden sollen.
* Das erste Argument, das mit einem -, einer Klammer (, ), einem Komma , oder einem Ausrufezeichen ! beginnt, wird als Anfang eines Ausdrucks interpretiert, der bestimmt, wonach gesucht wird.
* Alle Argumente davor werden als Verzeichnisnamen angesehen.
* Wenn kein Verzeichnis angegeben ist, wird das aktuelle Verzeichnis genommen.
* Wenn keine Aktion angegeben ist, wird die Aktion -print ausgeführt (es wird stattdessen empfohlen -print0 zu verwenden).
 
===== -P  =====
Keinen symbolischen Links folgen* Dies ist das Standardverhalten.
* Wenn find eine Datei untersucht oder Informationen über diese ausgibt, und die Datei ein symbolischer Link ist, dann werden die Informationen von dem symbolischen Link selbst verwendet.
 
===== -L  =====
Symbolischen Links folgen* Wenn find eine Datei untersucht oder Informationen über diese ausgibt, dann werden die Informationen von der Datei verwendet, auf die der symbolische Link verweist (es sei denn, der Link ist kaputt oder find nicht in der Lage ist, die Datei zu untersuchen, auf die der Link zeigt).
* Die Verwendung dieser Option impliziert die Option -noleaf.
* Wenn Sie später die Option -P verwenden, wird -noleaf immer noch Auswirkungen zeigen. Wenn -L aktiv ist und find einen symbolischen Link zu einem Unterverzeichnis während seiner Suche findet, wird das Unterverzeichnis durchsucht, auf das der symbolische Link zeigt.
* Wenn die Option -type immer auf den Typ der Datei angewendet, auf die ein symbolischer Link zeigt, anstatt auf den Link selbst (es sei denn, der symbolische Link ist kaputt).
* Die Verwendung von -L bewirkt, dass die Prädikate -lname und -ilname immer logisch falsch zurückliefern.
 
===== -H  =====
Keinen symbolischen Links folgen, es sei denn …* ...die Parameter in der Kommandozeile werden ausgewertet.
* Wenn find Dateien auswertet oder Informationen über diese ausgibt, werden die verwendeten Informationen vom symbolischen Link selbst benutzt werden.
* Die einzige Ausnahme dieses Verhaltens ist, wenn eine in der Kommandozeile angegebene Datei ein symbolischer Link ist und dem Link gefolgt werden kann.
* In dieser Situation werden die Informationen der Datei genommen, auf die der symbolische Link verweist.
* Die Informationen über den Link selbst dienen als Fall-Back für den Fall, dass die Datei, auf die der Link zeigt, nicht untersucht werden kann.
* Wenn -H aktiv ist und einer der Pfade in der Kommandozeile ein symbolischer Link zu einem Verzeichnis ist, werden die Inhalte dieses Verzeichnisses untersucht (wobei natürlich -maxdepth 0 das verhindern kann).
 
=====  -follow  =====
Veraltet. Verwenden Sie die Option -L stattdessen. Dereferenziert symbolische Links. Impliziert -noleaf. Wenn die Option -H oder -L nicht angegeben wird, ändert die Position von -follow das Verhalten des Prädikats -newer.
* Alle Dateien, die als Argumente von -newer aufgeszählt sind, werden dereferenziert, wenn es sich bei ihnen um symbolische Links handelt. Das gleiche gilt für -anewer und -cnewer. Genauso wird das Prädikat -type immer auf den Typ der Datei angewendet, auf den der symbolische Link zeigt und nicht auf den Link selbst. Die Verwendung von -follow hat zur Folge, dass die Prädikate -lname und -ilname immer logisch falsch zurückliefern.
 
==== Dateisysteme ====
=====  -xdev  =====
durchsucht keine Verzeichnisse in anderen Dateisystemen/Partitionen
 
=====  -fstype Typ  =====
die Datei ist in einem Dateisystem vom angegebenen Typ; unter anderem werden minix, msdos, ext und proc erkannt
 
===  Name ===
Mit vollständigem Namen  find -name hausarbeit.odt
* Sucht die Datei '''hausarbeit.odt''' im aktuellen Verzeichnis und allen Unterverzeichnissen. Sind mehrere Dateien dieses Namens vorhanden, werden alle Fundstellen aufgelistet. Jokerzeichen, [http://de.wikipedia.org/wiki/Wildcard_%28Informatik%29 Wildcards], wie der <tt><nowiki>*</nowiki></tt> oder das <tt>?</tt> müssen maskiert werden, sonst interpretiert sie schon die Shell. find -name "*.pdf" 
* Sucht im aktuellen Verzeichnis nach PDF-Dateien. <tt>-name</tt> berücksichtigt die Groß-/Kleinschreibung bei der Suche, findet also mit obigen Beispiel keine Datei(en) mit Endung '''<nowiki>*.PDF</nowiki>'''. Das <tt><nowiki>*</nowiki></tt> steht für eine beliebige Anzahl Zeichen. find -iname "a*.pdf" 
* Sucht im aktuellen Verzeichnis nach '''.pdf'''- und '''.PDF'''-Dateien, die mit <tt>a</tt> oder <tt>A</tt> beginnen.  find -name "katze.*" 
* findet '''katze.jpg''', '''katze.png''', '''katze.txt''' usw.  find -name "katze.??g" 
* findet '''katze.jpg''', '''katze.png''' usw. Jedes Fragezeichen steht für ein einzelnes Zeichen. find -name "*foo*.*x*" 
* findet '''foo.x''', '''afoo.x''', '''foob.txt''' usw.
 
==== -name <Muster> ====
Finde Dateien, deren Name <tt><Muster></tt> entspricht. Mit dieser Option wird <tt><Muster></tt> wie ein Suchmuster behandelt (siehe Kapitel [http://www.murnauer.de/mandrakeref/glob-regex.html Suchmuster und Reguläre Ausdrücke]).
 
==== -iname <Muster> ====
Findet Dateien mit Name, wie <tt>-name</tt>, ignoriert jedoch Groß- und Kleinschreibung.
 
====  -path Name ====
Findet Dateien mit Name, wobei Name auch Pfadangaben enthalten kann ("*/include/*.h")
* Sucht man mit Verzeichnisnamen, in denen ein Schrägstrich '/' vorkommt, kommt man mit '-name' nicht weiter.
* Der Parameter '-path' ist hier die Lösung, denn er erlaubt die Interpretation des Zeichens '/'.  find -path "*2013/J*"
* findet '''~/fotos/2013/Juni''' und '''~/musik/2013/Juli''', aber nicht '''~/dokumente/2013-Juni'''
 
====  Reguläre Ausdrücke ====
<tt>find</tt> hat nicht nur einfach RegEx-Support, es beherrscht auch mehrere unterschiedliche Arten der RegEx-Syntax.
* Mit <tt>-regextype</tt> und eine der unterstützten Arten wie ''posix-awk'', ''posix-egrep'', kannst du den Typ wählen. Lies unter <tt>man find</tt> nach, welche Arten unterstüzt werden.
* Ein kurze Beispiel. Sagen wir ich suche alle Dateien die entweder eine .php oder .js Endung. Ich könnte das folgende laufen lassen:
* find -regextype posix-egrep -regex '.*(php|js)$'* die egrep-Syntax <tt>-regextype posix-egrep</tt> zu benutzen und hinten kommt der Reguläre Ausdruck nach dem gesucht wird.
* Der Ausdruck beginnt und endet mit einem Hochkomma, damit die Shell nicht versucht die RegEx auszuwerten.
* Der Ausdruck <tt>.*</tt> ist ein Joker und bedeute „ein oder mehr beliebige Zeichen“. <tt>(php|js)</tt> weist an nach ''php'' oder ''js'' zu suchen.
* Die Pipe (|) steht hier für "oder".
* Das Dollarzeichen "$" hinten weist an, den Ausdruck am Ende eines Strings zu suchen.
* Also trifft etwa eine Datei namens ''js.txt'' nicht auf die Abfrage zu.
 
=====  -regex Muster =====
Wie "-name", nur kann das Muster reguläre Ausdrücke enthalten
 
=====  -regex Muster  =====
der Pfadname passt zu dem regulären Ausdruck Muster
 
===== -regex <Muster>:  =====
Wie <tt>-name</tt>, jedoch wird hier <tt>Muster</tt> als re­gulärer Ausdruck behandelt.
 
=====  -iregex Muster =====
Wie „-regex“ jedoch ohne Groß-/keinschreibung zu beachten
 
===== -iregex <Muster>:  =====
Wie <tt>-regex</tt>, ignoriert aber Groß- und Kleinschreibung.
 
=====  -regextype type =====
Ändert die Syntax der regulären Ausdrücke, die von -regex und -iregex verstanden werden. Folgende Typen sind implementiert: emacs (Standard), posix-awk, posix-basic, posix-egrep und posix-extende
 
===  Dateitypen ===
====  -type Typ ====
Findet Dateien eines bestimmten Types
 
{|
|-
|  | b
|  |
|-
|  | c
|  |
|-
|  | d
|  |
|-
|  | p
|  |
|-
|  | f
|  |
|-
|  | l
|  |
|-
|  | s
|  |
 
|-
|}
 
===== Finde nur Dateien  =====
find -type f 
* Das <tt>f</tt> steht für 'files'. Findet keine Verzeichnisse, aber alle herkömmlichen Dateien in allen Unterverzeichnissen.
 
===== Finde nur Verzeichnisse  =====
find -type d 
* Das <tt>d</tt> steht für 'directories'. Findet alle Unterverzeichnisse, aber keine sonstigen Dateien.
 
====  -type C  ====
die Datei ist vom Typ C; folgende Typen werden unterschieden:
* b gepufferte Gerätedatei für ein blockorientiertes Gerät c ungepufferte Gerätedatei für ein zeichenorientiertes Gerät d Verzeichnis p benannte Pipeline (FiFo) f normale Datei l symbolischer Link s Socket
 
====  -xtype C  ====
das gleiche wie -type für alle Dateien, die keine symbolischen Links sind; wenn die Datei ein symbolischer Link ist und die Option -follow nicht gesetzt ist, wird die Datei, auf die der Link zeigt, auf den Typ C geprüft; wenn die Option -follow gesetzt ist, ist der Test wahr, wenn C = l ist
 
==== -type <Typ>:  ====
Suche nach einem bestimmten Dateityp. <tt><Typ></tt> kann folgende Werte annehmen: <tt>f</tt> (reguläre Datei), <tt>d</tt> (Verzeichnis), <tt>l</tt> (symbolischer Verweis), <tt>s</tt> (Socket), <tt>b</tt> (Blockdatei), <tt>c</tt> (Zeichendatei) oder <tt>p</tt> (benannte Umleitung).
 
===  Datum/Zeit ===
==== Zeitstempel von Dateien ====
siehe [[Linux:Dateien:Zeitstempel]]
 
====  Tage ====
$ find -mtime -365
* Sucht nach Dateien, deren Inhalt innerhalb der letzten 365 Tage geändert wurde (<tt>mtime</tt> = modification time). Weitere Optionen sind * <tt>ctime</tt> (change time): Zeitpunkt, an dem der Status der Datei geändert wurde (Name, Rechte)
* <tt>atime</tt> (access time): Zeitpunkt an dem auf die Datei zugegriffen wurde.
* Ein Dateilisting selbst ist damit nicht gemeint. Bei Bilddateien zählt die Vorschaufunktion eines grafischen Dateimanagers aber bereits als Zugriff.
* Auch hier gibt es, ähnlich wie bei der [http://wiki.ubuntuusers.de/find#Nach-Dateigroesse-suchen Größe], Mindestalter (<tt>+</tt>), Höchstalter (<tt>-</tt>) und genaues Alter.
 
====  -newer Referenzdatei  ====
die Datei ist später verändert worden als die Referenzdatei; zusammen mit -follow tritt -newer nur in Effekt, wenn -follow vor -newer in der Kommandozeile steht
 
====  -used N  ====
auf die Datei ist N Tage nach der letzten Änderung zugegriffen worden
 
====  -atime Tage ====
Findet Dateien, auf die vor Tagen zugegriffen wurden (zur Angabe von Bereichen siehe Option "amin")
 
==== -atime <n>, -amin <n> ====
Finde Dateien, auf die zuletzt vor <tt><n></tt> Tagen (<tt>-atime</tt>) oder <tt><n></tt> Minuten (<tt>-amin</tt>) zugegriffen wurde. Sie können auch <tt>+<n></tt> oder <tt>-<n></tt> spezifizieren. Dann wird nach Dateien gesucht, auf die vor höchstens, bzw. mindestens <tt><n></tt> Tagen, bzw. Minuten zugegriffen wurde.
 
====  -atime N  ====
auf die Datei ist vor N*24 Stunden zugegriffen worden
 
====  -anewer Referenzdatei  ====
auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der Referenzdatei vergangen ist; im Zusammenhang mit -follow tritt -anewer nur in Effekt, wenn -follow vor -anewer in der Kommandozeile steht
 
==== -anewer <Datei> ====
Findet Dateien auf die später zugegriffen wurde als auf Datei <tt><Datei></tt>
 
====  -amin Minuten ====
Findet Dateien, auf die vor Minuten zugegriffen wurden. Um bspw. alle Dateien zu finden, deren Zugriff vor 2 bis 8 Minuten geschah, können die Angaben kombiniert werden: "-amin +2 -amin -8".
 
====  -amin N  ====
auf die Datei ist vor N Minuten zugegriffen worden
 
==== Minuten  ====
Sometimes you need to look for files modified in the last day or so, and the previous options are a bit too broad for that.
* The good news is that <tt>find</tt> also has the '''-amin''', '''-cmin''', and '''-mmin''', which are similar to the other options but they work with minutes rather than days.
* So if you want to look for something that was changed or accessed in the last day, you can use those options.
* find -amin -5
* nach Dateien suchen, auf die in den letzten 5 Minuten zugegriffen wurde. Analog: <tt>-cmin</tt>, <tt>-mmin</tt>.
 
====  Alle Dateien, auf die in der letzten Minute zugegriffen wurde ====
Um die nachfolgende Suche erfolgreich enden zu lassen, manipulieren wir mit Hilfe von "touch" die Zugriffszeiten einiger Dateien '''touch sax* find . -amin 1 .''' ./saxsys.tgz ./sax_logo.gif
 
==== -ctime <n>, -cmin <n>, -cnewer <Datei> ====
Genau wie <tt>-atime</tt>, <tt>-amin</tt> und <tt>-anewer</tt>, doch in Bezug auf die letzte Inhaltsänderung der Datei.
 
====  -ctime N  ====
der Dateistatus wurde vor N*24 Stunden geändert
 
====  -cmin N  ====
der Status der Datei wurde vor N Minuten geändert
 
====  -cnewer Referenzdatei  ====
der Status der Datei wurde vor weniger Zeit verändert, als seit der letzten Veränderung der Referenzdatei vergangen ist; zusammen mit -follow tritt -cnewer nur in Effekt, wenn -follow vor -cnewer in der Kommandozeile steht
 
=====  Vergleich  =====
$ find -cnewer /tmp/referenz
* Nach Dateien suchen, die nach der Referenzdatei geändert wurden. Mit <tt>touch --date='15:00' /tmp/referenz</tt> erstellt man sich eine Referenzdatei, wenn man keine hat.
 
====  -mtime Tage ====
Findet Dateien, die vor Tagen geändert wurden (zur Angabe von Bereichen siehe Option »amin«)
 
====  -mtime N  ====
der Inhalt der Datei wurde vor IN*24 Stunden verändert
 
====  -mmin N  ====
der Inhalt der Datei wurde vor N Minuten verändert
 
====  -daystart  ====
mißt die Zeiten für die -amin, -atime, -cmin, -ctime, -mmin und -mtime Eigenschaften vom Beginn des aktuellen Tages anstelle der letzten 24 Stunden.
* Diese Option betrifft nur die Tests, die weiter hinten in der Kommandozeile geschrieben sind.
* Werden zeit-bezogene Tests durchgeführt (siehe unten), wird der Beginn des aktuellen Tages als Zeitstempel genommen (und nicht der Zeitpunkt vor 24 Stunden, was der Standard-Einstellung entspricht).
 
===  Größ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 <tt>find</tt> 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 <tt>-size</tt>, 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 <tt>+</tt> oder <tt>-</tt> zusätzlich zur Zahl.
* Also sollte <tt>find -size +100k</tt> alle Dateien größer als 100 kB zurückgeben. Und <tt>find -size -100k</tt> alles was kleiner ist.
* Mit dem <tt>-empty</tt>-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 <tt>find</tt> 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, d.h. 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 <tt>-</tt> vor der Zahl bedeutet "bis zu". Das <tt>c</tt> hinter der Zahl bedeutet <tt>character</tt>, welche früher 1 Byte belegten, aber <tt>b</tt> ist schon für die Maßeinheit Block (= 512 Bytes) vergeben. Mittels <tt>-ls</tt> 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 <tt>+</tt>). Statt <tt>M</tt> kann man auch <tt>k</tt> und <tt>G</tt> 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 [http://wiki.ubuntuusers.de/wc 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 <tt>b</tt> ist gleich bedeutend. Wenn es Probleme mit der Größe gibt, dann wahrscheinlich, weil man <tt>c</tt> oder <tt>k</tt> oder <tt>M</tt> 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, bzw. 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 <tt>find</tt> 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 <tt>-user</tt> oder <tt>-uid</tt> Optionen. Die <tt>-uid</tt> Option erlaubt dir nach der nummerischen User-ID (UID) zu suchen und <tt>-user</tt> erlaubt dir nach Name oder UID zu suchen.
* Also wenn ich alle meine Dateien in einem Verzeichnis finden will benutze ich <tt>find -user jzb</tt>. Oder ich könnte <tt>find -user 1000</tt> oder <tt>find -uid 1000</tt> eingeben.
* Vielleicht suchst du die Dateien die Benutzer A ''oder'' B gehören. Das kannst du erreichen indem du den Operator <tt>-o</tt> 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 <tt>-not</tt>-Operator: find -not -user www-data
* Natürlich funktioniert <tt>-not</tt> 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 <tt>-group</tt>-Option.
* Diese Option arbeitet mit einem Gruppennamen oder einer Gruppen-ID (GID).
* Die grundlegende Syntax ist  <tt>find -group groupname</tt>.
* Können mit anderen Operatoren kombiniert werden, um z.B. 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
 
===  Zugriffsrechte ===
Gelegentlich möchtest du dein Dateisystem nach Dateien überprüfen, die global beschreibbar sind, oder sonstige „falsche“ Berechtigungen haben.
* Das <tt>find</tt>-Werkzeug unterstützt dies mit mehreren verschiedenen Optionen.
* Am einfachsten sind die Operatoren <tt>-readable</tt>, <tt>-writable</tt>, und <tt>-executable</tt>.
* Diese prüfen die Berechtigungen des ''aktuell angemeldeten'' Benutzers, der <tt>find</tt> 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 <tt>-perm</tt>, 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 <tt>110</tt> sagt <tt>find</tt> „Schau nach Dateien das Ausführen-Bit für Benutzer und Gruppe gesetzt haben!“ und das - sagt ''find'' die anderen Bits zu ignorieren.
* Das heißt, es spielt keine Rolle, wenn die Datei auch beschreibbar oder lesbar ist, solange die Bits 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 <tt>man</tt>-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 “<tt>ls ‑li </tt>''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 filesystem's ''mount point''. (This is likely to be either “<tt>/home</tt>” or “<tt>/</tt>” for files in your home directory.)
* The “<tt>‑xdev</tt>” option tells <tt>find</tt> to not search (descend into) any other filesystems.
* While most Unix and all Linux systems have a <tt>find</tt> command that supports the “<tt>‑inum</tt>” criterion, this isn't POSIX standard.
* Older Unix systems provided the “<tt>ncheck</tt>” 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 ====
* <tt><c1></tt> -a <c2>: Wahr, wenn beide, <tt><c1></tt> und <tt><c2></tt>, wahr sind. <tt>-a</tt> wird bereits implizit aktiviert, daher brauchen Sie nur <tt><c1> <c2> <c3></tt>... eingeben, wenn Sie alle Tests <tt><c1></tt>, <tt><c2></tt>,... durchführen möchten.
* <tt><c1> -o <c2></tt>: Wahr, wenn entweder <tt><c1></tt>, <tt><c2></tt> oder beide wahr sind. <tt>-o</tt> hat eine geringere Wertigkeit als <tt>-a</tt>. Wenn Sie also Dateien möchten, die Kriterium <tt><c1></tt> oder <tt><c2></tt> und Kriterium <tt><c3></tt> entsprechen, müssen Sie Klammern verwenden: <tt>( <c1>-o <c2> ) -a <c3></tt>. Damit die hier verwendeten Klammern nicht von Ihrer Shell interpretiert werden, müssen Sie sie durch Voranstellen eines Rückstriches (\) schützen.
* <tt>-not <c1></tt>: Invertiert den Test <tt><c1></tt>. Also ist <tt>-not <c1></tt> wahr, wenn <tt><c1></tt> falsch ist.
 
===  Operatoren ===
Die Optionen, Tests und Aktionen können mit Operatoren verknüpft werden.
* Die Bearbeitung erfolgt von links nach rechts.
 
{| class="wikitable sortable"
|-
|  | '''( 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 (<tt>mindepth 3</tt>) UND bis Unterverzeichnis(se) 5 (<tt>-maxdepth 5</tt>).
* Weiters Beispiel der UND-Kombination
find -mindepth 3 -type f -name "*.avi" -size +5M
* Beginnt die Suche ab Unterverzeichnis(se) 3 (<tt>-mindepth 3</tt>), UND findet nur gewöhnliche Dateien (‑<tt>type f</tt>), die die Endung '''.avi''' besitzen UND mindestens 5 MB groß sind (<tt>-size +5M</tt>).
 
===  Oder-Kombination  ===
find -name "susi.*" -or -name "susanne.*"
* Sucht alle Dateien die mit "susi." ODER "susanne." beginnen.
 
===  ODER bzw. NICHT-Kombination ===
Man kann die Suchoptionen aber auch per ODER bzw. 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 <tt>-not</tt> 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.
 
==  Aktionen  ==
===  -ls  ===
zeigt das Verzeichnis in dem die getestete Datei gefunden wurde mit ls -dils an
 
===  -delete  ===
Löscht die gefundenen Dateien
 
====  Achtung! ====
Da find auch Unterverzeichnisse durchsucht, sollte mit dieser Option vorsichtig umgegangen werden.
* Mit find gelöschte Dateien landen nicht im Papierkorb und können nicht wieder hergestellt werden. Siehe auch [http://wiki.ubuntuusers.de/find#Die-Aktion-delete-steht-an-der-falschen-Stelle Die Aktion -delete steht an der falschen Stelle]
* Vor der Verwendung sollte ein Test ohne <tt>-delete</tt> voraus gehen, um sicher zu gehen, nicht zu viele Dateien zu löschen.
* Die <tt>-delete</tt>-Option impliziert <tt>-depth</tt>, d.h. man muss zum Testen auch <tt>-depth</tt> setzen, um keine Überraschung zu erleben. Es ist auch sorgfältig darauf zu achten, an welcher Position <tt>-delete</tt> steht.  find test/ -name "c*" -delete 
* Löscht im Verzeichnis '''test''' und dessen Unterverzeichnissen alle Dateien, die mit "c" beginnen.
* Der Befehl löscht auch Verzeichnisse selbst, die mit "c" beginnen, diese jedoch nur, wenn sie leer sind, wie allgemein üblich bei Linux.
* Das ist der Grund, weshalb <tt>-delete</tt> ein <tt>-depth</tt> impliziert:
* Wenn erst in den Unterverzeichnissen gelöscht wird kann ein leeres Oberverzeichnis auch gelöscht werden, umgekehrt nicht.
 
===  Find und anderen Kommandos  ===
Now that you've found the files you're looking for, what are you going to do with them?
* You can use <tt>find</tt> in conjunction with '''xargs''' or the '''-exec''' option to manipulate files after you've found what you're looking for.
* Say you want to change the ownership of a bunch of files from root to www-data. Finding all the files is only the first step; you also need to change the ownership.
* Doing it manually from a list of files returned by <tt>find</tt> sounds like tedium, and it is. So you might want to use the '''-exec''' option to change the ownership:
 
find -user root -exec chown www-data {} \;
* That command tells find to pass all the files it finds to the '''chown''' utility and change the ownership to '''www-data'''. Piece of cake.
 
====  Dateien bearbeiten ====
Schließlich wünscht man sich, mit der gefundenen Datei etwas anstellen zu können, d.h. die gefundene Datei durch ein Kommando zu schleusen.
* Mit der Option -exec Kommando(s) {} ; wird in jedem Schritt die gefundene Datei der Reihe nach mit den angegebenen Kommandos bearbeitet.
* Die geschweiften Klammern dienen dabei als Platzhalter, der den aktuellen Dateinamen enthält.
* Das Semikolon schließt die exec-Option ab:
 
'''Suche nach leeren Dateien und zeige diese mittels "ls -l" an'''
$ find ./bsp/ -empty -exec ls -l \{\} \; 
insgesamt 0  insgesamt 0 
-rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/bla/file 
-rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/foo/file
 
'''Bemerkung'''
* Die Maskierung der geschweiften Klammern und des Semikolons ist entscheidend, da diese sonst von der Shell substituiert werden (ein Semikolon wird bspw. entfernt).
* Auch muss zwischen schließender Klammer und Semikolon ein Leerzeichen stehen!
 
==== -exec Kommando {} \;  ====
Wendet auf alle gefundenen Dateien den Shellbefehl "Kommando" an. {} steht dabei als Platzhalter für die gefundenen Dateinamen.
* Das Zeichen ; terminiert den von find aufzurufenden Shellbefehl, damit es nicht unbeabsichtigt von der Shell interpretiert wird muss es mit \ maskiert werden.
 
====  -exec Kommando; << ====
führt das Kommando aus; die Aktion ist wahr, wenn das Kommando einen Status von Null liefert; alle auf den Kommandonamen folgenden Argumente bis zu einem Semikolon.
* werden als Kommandozeilenargumente für das Kommando interpretiert.
* das Semikolon kann nicht weggelassen werden, und es muss durch mindestens ein Whitespace von der letzten Option getrennt werden
* die Konstruktion {} wird durch den Pfadnamen der Datei ersetzt; die Klammern und das Semikolon müssen in der Kommandozeile für find quotiert werden, damit sie nicht von der Shell bearbeitet werden
 
====  Using ‑exec Efficiently ====
The <tt>‑exec</tt> action takes a command (along with its options) as an argument.
* The arguments should contain <tt>{}</tt> (usually quoted), which is replaced in the command with the name of the currently found file.
* The command is terminated by a semicolon, which must be quoted (“escaped”) so the shell will pass it literally to the <tt>find</tt> command.
* To use a more complex action with <tt>‑exec</tt>, you can use “''complex-command''” as the Unix command.
* Here's a somewhat contrived example, that for each found file replaces “Mr.” with “Mr. or Ms.”, and also converts the file to uppercase:  find ''whatever...'' -exec sh -c 'sed "s/Mr\./Mr. or Ms./g" "{}" \'      | tr "[:lower:]" "[:upper:]" >"{}.new"' \;
* The <tt>‑exec</tt> action in <tt>find</tt> is very useful.&nbsp; But since it runs the command listed for every found file, it isn't very efficient.
* On a large system this makes a difference!&nbsp; One solution is to combine <tt>find</tt> with <tt>xargs</tt> as discussed [http://content.hccfl.edu/pollock/Unix/FindCmd.htm#xargs above]:  find ''whatever...'' | xargs ''command''
* However this approach has two limitations.&nbsp; Firstly not all commands accept the list of files at the end of the command.&nbsp; A good example is <tt>cp</tt>:  find . -name \*.txt | xargs cp /tmp  <nowiki># This won't work!</nowiki>
 
(Note the Gnu version of <tt>cp</tt> has a non-POSIX option “<tt>‑t</tt>” for this, and Gnu <tt>xargs</tt> has options to handle this too.)
* Secondly, filenames may contain spaces or newlines, which would confuse the command used with <tt>xargs</tt>.&nbsp; (Again Gnu tools have options for that, “<tt>find&nbsp;...&nbsp;‑print0&nbsp;|&nbsp;xargs&nbsp;‑0&nbsp;...</tt>”.)
* There are standard POSIX (but non-obvious) solutions to both problems.&nbsp;
* An alternate form of <tt>‑exec</tt> ends with a plus-sign, not a semi-colon.&nbsp; This form collects the filenames into groups or sets, and runs the command once per set.&nbsp;
* This is exactly what <tt>xargs</tt> does, to prevent argument lists from becoming too long for the system to handle.
* In this form, the <tt>{}</tt> argument expands to the set of filenames.&nbsp;
* For example:
find / -name core -exec /bin/rm -f '{}' +
 
==== -execdir Kommando {} +  ====
Wendet auf alle gefundenen Dateien den Shellbefehl "Kommando" an. Im Ggs. zu <tt>-exec</tt> wird das Kommando im Verzeichnis, in dem die Datei liegt, ausgeführt.
* Das Plus statt des <tt>\;</tt> am Ende provoziert die parallele Ausführung der Kommandos, und kann auch bei -exec verwendet werden
 
===== Mehrere Kommandos ausführen =====
As for the <tt>find</tt> command, you can also just add more <tt>-exec</tt> commands in a row:
$ find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
 
* Note that this command is, in its result, equivalent of using  chgrp -v new_group file '''&&''' chmod -v 770 file on each file.
* All the <tt>find</tt>'s parameters such as <tt>-name</tt>, <tt>-exec</tt>, <tt>-size</tt> and so on, are actually '''tests''': <tt>find</tt> will continue to run them one by one as long as the entire chain so far has evaluated to ''true''. So each consecutive <tt>-exec</tt> command is executed '''only if''' the previous ones returned ''true'' (i.e. <tt>0</tt> exit status of the commands). But <tt>find</tt> also understands logic operators such as ''or'' (<tt>-o</tt>) and ''not'' (<tt>!</tt>). Therefore, to use a chain of <tt>-exec</tt> tests '''regardless''' of the previous results, one would need to use something like this:
$ find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
 
@user Unfortunately, I don't know if it is still necessary.
* I did some test just now and haven't come across a situation where it would change anything.
* I guess it's just "good practice" that will die out. –&nbsp;[http://unix.stackexchange.com/users/9382/rozcietrzewiacz rozcietrzewiacz] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment24573_18085 Aug 5 '11 at 8:04]
$ find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;
 
@Gilles: The wonders of <tt>-c</tt>'s odd handling of $0 make me think this is wrong every time I glance at it, but its definitely correct.
–&nbsp;[http://unix.stackexchange.com/users/977/derobert derobert] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment64156_18078 Aug 24 '12 at 16:52]
* I like the explicit shell being defined... –&nbsp;[http://unix.stackexchange.com/users/7586/djangofan djangofan] [http://unix.stackexchange.com/questions/18077/how-can-i-use-two-bash-commands-in-exec-of-find-command#comment64180_18078 Aug 24 '12 at 19:05]
 
==== -ok ====
Anstatt <tt>-exec</tt> kann man auch <tt>-ok</tt> verwenden. Hierbei wird jedes mal gefragt, ob man die Aktion ausführen möchte.
* Meist empfiehlt sich <tt>-execdir</tt> statt <tt>-exec</tt>  find test -type d -exec tar -cjf archiv.bz2 {} \;
 
<tt>-execdir</tt> führt das Kommando aus dem Verzeichnis heraus aus, in dem die Datei gefunden wird.
* So wird also für jedes Unterverzeichnis ein '''archiv.bz2''' vor Ort angelegt.
* Mit einem einfachen <tt>-exec</tt> würde für jedes Verzeichnis ein Archiv im aktuellen Verzeichnis angelegt, d.h. das Archiv immer wieder überschrieben, so dass am Ende nur ein Archiv mit den Ergebnissen des letzten Verzeichnisses existiert.
 
=====  -ok Kommando;  =====
wie -exec, vor der Ausführung des Kommandos wird aber noch eine Bestätigung erwartet; nur eine Eingabe, die mit einem B oder einem y beginnt, führt zur Ausführung des Kommandos
 
===== -ok Kommando {} \;  =====
Wie <tt>-exec</tt>, allerdings wird vor jeder Aktion eine Bestätigung erfragt. {} steht dabei als Platzhalter für die gefundenen Dateinamen
 
==== -okdir  ====
find -name "*pdf" -okdir xpdf {} \;
 
<tt>-okdir</tt> fragt im Gegensatz zu <tt>-execdir</tt> vor jeder Datei nach, ob man wirklich die Aktion ausführen möchte.
 
===== Parallele Ausführung mit +  =====
find -name "*pdf" -execdir md5sum {} + 
* Beendet man ein Kommando mit Plus <tt>+</tt> statt mit Semikolon <tt><nowiki>;</nowiki></tt>, so werden mehrere, u.U. alle Funde auf einen Rutsch an das Kommando übergeben.
* Dies ist dann sinnvoll, wenn das Kommando selbst mit mehreren Parametern zurechtkommt. Beispiele:  find test -type f -execdir md5sum {} ";"
* ergibt: md5sum a md5sum b md5sum c
* Dagegen ergibt:  find test -type f -execdir md5sum {} +  md5sum a b c
* Das + kann nur verwendet werden, wenn die geschweiften Klammern unmittelbar davor stehen.
* Eine etwas heikle Angelegenheit ist das Löschen mit der Option <tt>-delete</tt>.
 
===== -okdir Kommando {} +  =====
Wie eine Kombination von <tt>-ok</tt> und <tt>-execdir</tt>, d.h. es wird eine Bestätigung erfragt, und das Kommando wird im Fundordner ausgeführt.
* Das Plus kann statt ";" verwendet werden, wenn die <tt>{}</tt> der letzte Parameter sind; dann werden mehrere Funde auf einmal an <tt>Kommando</tt> übergeben.
 
==  Ausgabe formatieren ==
===  -print  ===
gibt den vollständigen Pfadnamen der getesteten Datei auf die Standardausgabe
 
===  -fprint Ausgabedatei  ===
schreibt den Pfadnamen der getesteten Datei in die Ausgabedatei; wenn die Ausgabedatei nicht existiert, wird sie erzeugt, sonst wird sie erweitert; die Standardausgabe und die Standardfehlerausgabe werden als /dev/stdout und /dev/stderr angesprochen
 
==== -fprint Datei  ====
Gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei "Datei"
 
===  -print0  ===
gibt den Pfadnamen der getesteten Datei, von einem Nullbyte abgeschlossen, auf die Standardausgabe; auf diese Weise können auch Pfadnamen korrekt weiterverarbeitet werden, die ein Zeilenende enthalten
 
====  -fprint0 Ausgabedatei  ====
schreibt den Namen der getesteten Datei in die Ausgabedatei und schließt die Ausgabe mit einem Nullbyte ab, wie -print0
 
===  -printf ===
Using the (non-standard) “<tt>‑printf</tt>” action instead of the default “<tt>‑print</tt>” is useful to control the output format better than you can with the <tt>ls</tt> or <tt>dir</tt> utilities.
* You can use <tt>find</tt> with the <tt>‑printf</tt> action to produce output that can easily be parsed by other utilities or imported into spreadsheets or databases. See the Gnu <tt>find</tt> man page for the dozens of possibilities with the <tt>‑printf</tt> action.
* In fact, <tt>find</tt> with <tt>‑printf</tt> is more versatile than <tt>ls</tt><nowiki>; it is the preferred tool for forensic examiners even on Windows systems, to list file information.</nowiki>
* For example the following displays non-hidden (no leading dot) files in the current directory only (no subdirectories), with an custom output format:  find . -maxdepth 1 -name '[!.]*' -printf 'Name: %16f Size: %6s\n'
 
“<tt>‑maxdepth</tt>” is a Gnu extension. On a modern, POSIX version of <tt>find</tt> you could use this:  find . -path './*' -prune ...
* On any version of <tt>find</tt> you can use this more complex (but portable) code:  find . ! -name . -prune ...
* which says to “prune” (don't descend into) any directories except “<tt>.</tt>”.
* Note that “<tt>‑maxdepth 1</tt>” will include “<tt>.</tt>” unless you also specify “<tt>‑mindepth 1</tt>”. A portable way to include “<tt>.</tt>” is:  find . \( -name . -o -prune \) ...
* The “<tt>\(</tt>” and “<tt>\)</tt>” are just parenthesis used for grouping, and escaped from the shell. The “<tt>‑o</tt>” means Boolean ''OR''. As a system administrator, you can use <tt>find</tt> to locate suspicious files (e.g., world writable files, files with no valid owner and/or group, Set files, files with unusual permissions, sizes, names, or dates). Here's a more complex example (which I saved as a shell script so I can run it often):  find / -noleaf -wholename '/proc' -prune \      -o -wholename '/sys' -prune \      -o -wholename '/dev' -prune \      -o -wholename '/windows-C-Drive' -prune \      -o -perm -2 ! -type l  ! -type s \      ! \( -type d -perm -1000 \) -print
* This says to seach the whole system, skipping the directories <tt>/proc</tt>, <tt>/sys</tt>, <tt>/dev</tt>, and <tt>/windows-C-Drive</tt> (presumably a Windows partition on a dual-booted computer).
* The Gnu <tt>‑noleaf</tt> option tells <tt>find</tt> not to assume all remaining mounted filesystems are Unix file systems (you might have a mounted CD for instance). The “<tt>‑o</tt>” is the Boolean OR operator, and “<tt>!</tt>” is the Boolean NOT operator (applies to the following criteria).
* So these criteria say to locate files that are world writable (“<tt>‑perm ‑2</tt>”, same as “<tt>‑o=w</tt>”) and NOT symlinks (“<tt>! ‑type l</tt>”) and NOT ''sockets'' (“<tt>! ‑type s</tt>”) and NOT directories with the ''sticky'' (or ''text'') bit set (“<tt>! \( ‑type d ‑perm ‑1000 \)</tt>”).
 
(Symlinks, sockets, and directories with the sticky bit set, are often world-writable and generally not suspicious.)
 
====  -printf Format  ====
gibt für die getestete Datei die Zeichenkette Format auf der Standardausgabe aus; Format kann verschiedene Sonderzeichen und Platzhalter enthalten, die von find bearbeitet werden:
 
\aAlarmton \bRückschritt \cAbbruch der Ausgabe \fSeitenvorschub \nZeilenvorschub \rWagenrücklauf \thorizontaler Tabulator \vvertikaler Tabulator \\der Backslash selbst
* ein Backspace gefolgt von irgendeinem anderen Zeichen wird als normales Zeichen interpretiert und einfach ausgegeben
 
%% das Prozentzeichen selbst %a die Zeit des letzten Zugriffs auf die Datei, in dem Format der ctime Funktion %A k die Zeit des letzten Zugriffs auf die Datei, in dem von k bestimmte Format; k hat dabei das gleiche Format wie der entsprechende Parameter der strftime Funktion in C:
 
@ Sekunden seit dem 1.1.1970 0 Uhr GMT H Stunde (00 bis 23) I Stunde (01 bis 12) k Stunde (0 bis 23) l Stunde (1 bis 12) M Minute (00 bis 59) p PM oder AM r Zeit, 12 Stunden (hh:mm:ss: AM/PM) S Sekunden (00 bis 61) T Zeit, 24 Stunden (hh:mm:ss) X Zeit (H:M:S) Z Zeitzone, oder nichts a abgekürzter Wochentag A ausgeschriebener Wochentag b abgekürzter Monatsname B ausgeschriebener Monatsname c Datum und Zeit d Tag im Monat D Datum (mm/dd/yy) h das gleiche wie b j der Tag im Jahr m die Zahl des Monats U die Nummer der Woche, Sonntag als erster Wochentag w die Zahl des Wochentags W die Nummer der Woche, Montag als erster Wochentag x Datum (mm/dd/yy) y die letzten beiden Stellen der Jahreszahl Y die Jahreszahl
 
%b die Dateigröße in 512 Byte Blöcken (aufgerundet) %c das Datum der letzten Statusänderung im Format der C ctime Funktion %Ck das Datum der letzten Statusänderung im Format der BR strftime " Funktion; Parameter wie oben" %d die Höhe der Datei im Verzeichnisbaum; Null bedeutet, dass die Datei Kommandozeilenargument ist
 
%f der Name der getesteten Datei, ohne Verzeichnisse
 
%g der Gruppenname der getesteten Datei oder die Kennzahl, wenn die Gruppe nicht eingetragen ist
 
%G die Gruppenkennzahl
 
%h die Verzeichnisnamen des Pfadnamen der getesteten Datei
 
%H das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
 
%i die Nummer der Inode der getesteten Datei
 
%k die aufgerundete Größe der getesteten Datei in Kilobytes
 
%l das Objekt, auf die ein symbolischer Link zeigt; leer, wenn die getestete Datei kein symbolischer Link ist
 
%m die Zugriffsrechte als Oktalzahl
 
%n die Anzahl der harten Links auf die getestete Datei
 
%p der Pfadname der Datei
 
%P der Pfadname und das Kommandozeilenargument (Test), mit dem die Datei gefunden wurde
 
%s die Größe der getesteten Datei in Bytes
 
%t die Zeit der letzten Änderung, im ctime Format
 
%Tk die Zeit der letzten Änderung, im strftime Format (siehe oben)
 
%u der Name des Eigentümers der getesteten Datei oder die Kennzahl, wenn der Benutzer nicht eingetragen ist
 
%U die Benutzerkennzahl des Eigentümers der getesteten Datei
 
====  -fprintf Ausgabedatei Format  ====
schreibt den Namen der getesteten Datei in die Ausgabedatei und benutzt dabei das Format mit Sonderzeichen wie bei printf
 
===  -prune  ===
Wenn die Datei ein Verzeichnis ist, wird nicht in dieses hinabgestiegen. * wahr, wenn die Option -depth nicht angegeben ist
* falsch, wenn die Option -depth angegeben ist, hat keine Auswirkungen.
 
===  Beispiele  ===
Ohne weitere Angaben gibt find die Namen der gefundenen Dateien aus:  find /boot/grub/ -name "he*"  /boot/grub/hexdump.mod  /boot/grub/hello.mod  /boot/grub/help.mod 
* Wie bereits gesehen kann man mit <tt>-ls</tt> eine detailliertere Ausgabe erzeugen:  find /boot/grub/ -name "he*" -ls  168624    4 -rw-r--r--  1 root    root        3196 Jan 13 17:08 /boot/grub/hexdump.mod  168603    4 -rw-r--r--  1 root    root        1308 Jan 13 17:08 /boot/grub/hello.mod  168623    4 -rw-r--r--  1 root    root        2200 Jan 13 17:08 /boot/grub/help.mod
* Mit <tt>-exec</tt> und dessen Varianten lassen sich beliebige Programme auf den Fundstellen ausführen.
* Die Anzahl der Zeilen in Textdateien findet man mit <tt>wc -l DATEI</tt><nowiki>; kombiniert mit find sieht das so aus: </nowiki>
find -name "*.py" -exec wc -l {} \;  10 ./x/abc.py 6 ./x/date-form.py 102 ./x/download.py
* Das Kommando <tt>wc -l</tt> (Anzahl der Zeilen zählen) wird auf jede gefundene Datei angewendet.
* Die geschweiften Klammern werden durch die von find gefundenen Namen ersetzt.
* Am Ende muss der ganze Befehl mit einem Semikolon abgeschlossen werden.
* Damit das Semikolon nicht von der Shell interpretiert wird, muss man es mit einem Backslash oder Anführungsstrichen maskieren.
* Kombination mit <tt>-print</tt>  find tmp -name "a" -exec touch {} \; -print  ./tmp/a  ./tmp/a/a  ./tmp/a/a/a
 
<tt>touch</tt> setzt das Datum der Dateien auf den Ausführungszeitpunkt.
* Da touch aber nicht den Dateinamen ausgibt sieht man nicht, welche Dateien nun betroffen waren. Daher schickt man ein <tt>-print</tt> hinterher.
 
= Dokumentation =
== Man-Pages ==
== Info-Pages ==
= Links =
== Intern ==
== Weblinks ==
== Kontrollfragen ==
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
 
=  Typische Probleme =
===  Find ohne Ende ===
Wenn die Suche mit find läuft und viel zu viele Ergebnisse ausspuckt und nicht aufhören will, so bricht man find mit Strg + C ab.
 
===  Pfad muss vor Suchkriterium stehen ===
Wenn man den Stern <tt><nowiki>*</nowiki></tt> nicht maskiert kommt es oft zu folgender Meldung: find /tmp -name *sh find: Der Pfad muß vor dem Suchkriterium stehen: adhoc.sh Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Suchkriterium]
* Mit  find /tmp -name "*sh"
* ist das leicht geheilt.
 
===  Seltsame Größen ===
Bei der Suche nach Dateigrößen kann man leicht verzweifeln, wenn man nicht dahinter kommt, dass die Vorgabemaßeinheit Blöcke zu 512 Bytes sind.  find -size 200c 
* sucht nach Größen, die man vom Dezimalsystem her erwartet.
 
======  Seltsames Nichtfinden bei Größen wie k, M, G ======
Sucht man nach Dateien, die kleiner sind als 1000k, so werden Dateien bis maximal 999k gefunden:  find -size -1000k 
* Das klingt zunächst plausibel, aber es wird keine Datei gefunden, die 999001 Bytes groß ist, denn es wird erst aufgerundet (auf 1000k) und dann verglichen (nicht kleiner als 1000k).
* Krasser noch, wenn man Dateien bis 1M suchen wollte - selbst 1 Byte ist größer als die nächstkleinere Ganzzahl in dieser Maßeinheit, also größer als 0M, und wird daher nicht gefunden.
 
===  Kombination von UND und ODER  ===
Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.
 
===  Positionssensitiv ===
Bei mehreren Optionen und Ausdrücken (options und expressions) unterscheiden sich erstere von zweiteren dadurch, dass Optionen nicht mit 'ODER' gruppiert werden können - die Optionen werden immer für die ganze Suche verwendet.
* Stehen die Optionen hinter Ausdrücken, so sieht das aus, als habe der User eine andere Absicht gehabt, und man bekommt eine Warnung:
* Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt.  find tmp -name "a" -maxdepth 3 -mindepth 3  find: Warnung: Sie haben die Option `-maxdepth` nach dem Argument -name angegeben, aber Optionen sind nicht positionssensitiv (`-maxdepth` beeinträchtigt sowohl Tests, die vor ihr als auch nach ihr definiert sind). Diese Optionen ist vor den anderen Argumenten anzugeben.
* Provozieren kann man die Warnung etwa so:  find ./suchverzeichnis -maxdepth 4 -name foo -or -maxdepth 2
 
===  Xargs und Schleifen ===
Oft findet man Konstruktionen mit <tt>find ... xargs</tt> oder Shellschleifen die find bemühen.
* Fast immer lässt sich das Problem durch eine der [http://wiki.ubuntuusers.de/find#Aktionen Aktionen] (-okdir, -execdir, ...) eleganter lösen.
 
===  Aktion -delete an falscher Stelle ===
So löscht z.B. der folgende Aufruf den kompletten Inhalt des Ordners '''/home/otto/''': find /home/otto/ -delete -name Cache 
 
===  Common “Gotcha” ===
If the given expression to <tt>find</tt> does not contain any of the “action” primaries <tt>‑exec</tt>, <tt>‑ok</tt>, or <tt>‑print</tt>, the given expression is effectively replaced by:  find \( ''expression'' \) -print
* The implied parenthesis can cause unexpected results. For example, consider these two similar commands:  '''find -name tmp -prune -o -name \*.txt'''  ./bin/data/secret.txt  ./tmp  ./missingEOL.txt  ./public_html/graphics/README.txt  ./datafile.txt '''find -name tmp -prune -o -name \*.txt -print'''  ./bin/data/secret.txt  ./missingEOL.txt  ./public_html/graphics/README.txt  ./datafile.txt
* The lack of an action in the first command means it is equivalent to:  find . \( -name tmp -prune -o -name \*.txt \) -print
* This causes <tt>tmp</tt> to be included in the output. However for the second <tt>find</tt> command the normal rules of Boolean operator precedence apply, so the pruned directory does not appear in the output.
* A related issue is the precedence of the Boolean operators.&nbsp; OR has lower precedence than AND, and NOT has the highest precedence.&nbsp; When in any doubt, add parenthesis to your expressions.
* The <tt>find</tt> command can be amazingly useful.&nbsp; See the man page to learn all the criteria and actions you can use.
 
===  -regex ===
I'm having trouble using the regex of the <tt>find</tt> command. Probably something I don't understand about escaping on the command line.
* Why are these not the same?
find -regex '.*[1234567890]'
find -regex '.*[[:digit:]]'
 
* Regular expressions with character classes (e.g. <tt><nowiki>[[:digit:]]</nowiki></tt>) are not supported in the default regular expression syntax used by <tt>find</tt>.
* You need to specify a different regex type such as <tt>posix-extended</tt> in order to use them.
* Take a look at GNU Find's Regular Expression [http://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions documentation] which shows you all the regex types and what they support.
* I have some images named with generated uuid1 string.
* For example 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg.
* I want to find out all these images using "find" command: find . -regex "[a-f0-9\-]\{36\}\.jpg".
* But it doesn't work. Something wrong with the regex? Could someone help me with this? find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
* Note that you need to specify <tt>.*/</tt> in the beginning because <tt>find</tt> matches the whole path.
 
==== Beispiel ====
'''$ find . -name "*.jpg"''' 
./foo-111.jpg  ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
 
'''$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"''' 
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
 
'''$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"''' 
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.
 
'''find''' sucht nach Dateien, Verzeichnissen und Unterverzeichnissen
 
= Syntax =
find [-H] [-L] [-P] [-D Fehlersuchoptionen] [-OStufe] [Startpunkt …] [Ausdruck]
 
= Option =
{| class="wikitable"
|-
|-
! Option !! Beschreibung
! Option !! Beschreibung
|-
|-
| -name dateiname||Sucht Dateien des Namens dateiname
| -exec || Führt Befehl mit den gefundenen Dateien als Parameter aus
|-
| -iname dateiname||Sucht nach dateiname und ignoriert Groß- und Kleinschreibung
|-
| -size [+-]groesse[ck]||Sucht Dateien, die größer oder kleiner als groesse sind. c steht für Byte- und k für KByte-Werte. Ohne Einheitsangabe wird nach der Anzahl der belegten Blöcke (512 Byte) gesucht
|-
| -type [fdl]||Sucht Dateien eines bestimmten Typs: f für einfache Dateien, d für Verzeichnisse und l für symbolische Links
|-
| -atime [+-]zeit||Sucht Dateien, auf die seit mehr oder weniger als zeit Tagen nicht mehr zugegriffen wurde
|-
| -amin [+-]zeit||Sucht Dateien, auf die seit mehr oder weniger als zeit Minuten nicht mehr zugegriffen wurde
|-
| -mtime [+-]zeit||Sucht Dateien, die seit mehr oder weniger als zeit Tagen nicht mehr verändert wurden
|-
| -mmin [+-]zeit||Sucht Dateien, die seit mehr oder weniger als zeit Minuten nicht mehr verändert wurden
|-
| -perm 0000||Sucht Dateien mit den den Zugriffsrechten 0000 (Oktalzahl)
|-
| -user benutzername||Sucht Dateien des Benutzers benutzername
|-
| -exec befehl „{}“ „;“||Führt befehl mit den gefunden Dateien als Parameter aus. Die geschweiften Klammern stehen für den aktuell gefunden Dateinamen
|-
| -ok befehl „{}“ „;“||Führt befehl nach Rückfrage aus
|-
|-
| -ok || Führt Befehl nach Rückfrage aus
|}
|}


=  Typische Probleme =
=== Argumente ===
===  Find ohne Ende ===
=== Umgebungsvariablen ===
Wenn die Suche mit find läuft und viel zu viele Ergebnisse ausspuckt und nicht aufhören will, so bricht man find mit Strg + C ab.
=== Exit-Status ===
 
===  Pfad muss vor Suchkriterium stehen ===
Wenn man den Stern ''*</nowiki>'' nicht maskiert kommt es oft zu folgender Meldung: find /tmp -name *sh find: Der Pfad muß vor dem Suchkriterium stehen: adhoc.sh Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Suchkriterium]
* Mit  find /tmp -name "*sh"
* ist das leicht geheilt.
 
===  Seltsame Größen ===
Bei der Suche nach Dateigrößen kann man leicht verzweifeln, wenn man nicht dahinter kommt, dass die Vorgabemaßeinheit Blöcke zu 512 Bytes sind.  find -size 200c 
* sucht nach Größen, die man vom Dezimalsystem her erwartet.
 
======  Seltsames Nichtfinden bei Größen wie k, M, G ======
Sucht man nach Dateien, die kleiner sind als 1000k, so werden Dateien bis maximal 999k gefunden:  find -size -1000k 
* Das klingt zunächst plausibel, aber es wird keine Datei gefunden, die 999001 Bytes groß ist, denn es wird erst aufgerundet (auf 1000k) und dann verglichen (nicht kleiner als 1000k).
* Krasser noch, wenn man Dateien bis 1M suchen wollte - selbst 1 Byte ist größer als die nächstkleinere Ganzzahl in dieser Maßeinheit, also größer als 0M, und wird daher nicht gefunden.
 
=== Kombination von UND und ODER  ===
Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.
 
===  Positionssensitiv ===
Bei mehreren Optionen und Ausdrücken (options und expressions) unterscheiden sich erstere von zweiteren dadurch, dass Optionen nicht mit 'ODER' gruppiert werden können - die Optionen werden immer für die ganze Suche verwendet.
* Stehen die Optionen hinter Ausdrücken, so sieht das aus, als habe der User eine andere Absicht gehabt, und man bekommt eine Warnung:
* Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt.  find tmp -name "a" -maxdepth 3 -mindepth 3  find: Warnung: Sie haben die Option `-maxdepth` nach dem Argument -name angegeben, aber Optionen sind nicht positionssensitiv (`-maxdepth` beeinträchtigt sowohl Tests, die vor ihr als auch nach ihr definiert sind). Diese Optionen ist vor den anderen Argumenten anzugeben.
* Provozieren kann man die Warnung etwa so:  find ./suchverzeichnis -maxdepth 4 -name foo -or -maxdepth 2
 
===  Xargs und Schleifen ===
Oft findet man Konstruktionen mit ''find ... xargs'' oder Shellschleifen die find bemühen.
* Fast immer lässt sich das Problem durch eine der [http://wiki.ubuntuusers.de/find#Aktionen Aktionen] (-okdir, -execdir, ...) eleganter lösen.
 
===  Aktion -delete an falscher Stelle ===
So löscht zum Beispiel der folgende Aufruf den kompletten Inhalt des Ordners '''/home/otto/''': find /home/otto/ -delete -name Cache 


===  Common “Gotcha” ===
<noinclude>
If the given expression to ''find'' does not contain any of the “action” primaries ''‑exec'', ''‑ok'', or ''‑print'', the given expression is effectively replaced by:  find \( ''expression'' \) -print
* The implied parenthesis can cause unexpected results. For example, consider these two similar commands:  '''find -name tmp -prune -o -name \*.txt'''  ./bin/data/secret.txt  ./tmp  ./missingEOL.txt  ./public_html/graphics/README.txt  ./datafile.txt '''find -name tmp -prune -o -name \*.txt -print'''  ./bin/data/secret.txt  ./missingEOL.txt  ./public_html/graphics/README.txt  ./datafile.txt
* The lack of an action in the first command means it is equivalent to:  find . \( -name tmp -prune -o -name \*.txt \) -print
* This causes ''tmp'' to be included in the output. However for the second ''find'' command the normal rules of Boolean operator precedence apply, so the pruned directory does not appear in the output.
* A related issue is the precedence of the Boolean operators.  OR has lower precedence than AND, and NOT has the highest precedence.  When in any doubt, add parenthesis to your expressions.
* The ''find'' command can be amazingly useful.  See the man page to learn all the criteria and actions you can use.


=== -regex ===
== Anhang ==
I'm having trouble using the regex of the ''find'' command. Probably something I don't understand about escaping on the command line.
=== Siehe auch ===
* Why are these not the same?
{{Special:PrefixIndex/find}}
find -regex '.*[1234567890]'
----
find -regex '.*[[:digit:]]'
{{Special:PrefixIndex/xargs}}


* Regular expressions with character classes (e.g. ''[[:digit:]]</nowiki>'') are not supported in the default regular expression syntax used by ''find''.
=== Dokumentation ===
* You need to specify a different regex type such as ''posix-extended'' in order to use them.
* Take a look at GNU Find's Regular Expression [http://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions documentation] which shows you all the regex types and what they support.
* I have some images named with generated uuid1 string.
* For example 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg.
* I want to find out all these images using "find" command: find . -regex "[a-f0-9\-]\{36\}\.jpg".
* But it doesn't work. Something wrong with the regex? Could someone help me with this? find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
* Note that you need to specify ''.*/'' in the beginning because ''find'' matches the whole path.


==== Beispiel ====
; Man-Page
'''$ find . -name "*.jpg"''' 
# [[chmod]](1)
./foo-111.jpg  ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
# [[locate]](1)
# [[ls]](1)
# [[xargs]](1)
# [[lstat]](2)
# [[stat]](2)
# [[ctime]](3)
# [[fnmatch]](3)
# [[printf]](3)
# [[strftime]](3)
# [[regex]](7)
# [[find]] (1)


'''$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"''' 
;Info-Page
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
=== Links ===
==== Projekt ====
==== Weblinks ====


'''$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"''' 
[[Kategorie:Linux/Befehl]]
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.
[[Kategorie:findutils]]


'''find''' sucht nach Dateien, Verzeichnissen und Unterverzeichnissen
{{DEFAULTSORT:find}}
{{DISPLAYTITLE:find}}


[[Category:Linux:Befehl]]
</noinclude>
[[Category:Linux:Suchen]]
[[Category:Linux:Dateisystem]]

Aktuelle Version vom 11. Mai 2025, 12:40 Uhr

find - Dateien nach Eigenschaften suchen

Beschreibung

Werkzeug für die Suche nach Dateien

Auf vielfältige Weise die Suche filtern

  • Etwa Dateiname, -alter oder -größe
  • Formatierung der Ergebnisliste
  • Suchergebnisse können weiterverarbeitet werden

Implementierungen

Nicht alle Implementierungen sind identisch

  • Der Befehl find ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X
  • Ein Großteil der Syntax von find ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig
  • Bei Schwierigkeiten prüfen Sie die man-Page des Systems
find --version
find (GNU findutils) 4.10.0
Aktivierte Eigenschaften:D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=1)

Abgrenzung

Programm  Beschreibung
automatischer Vervollständigung
ls Dateien auflisten
Jokerzeichen (*,?, ...)
locate Suche nach Dateinamen
  • Schnell, da indexbasiert (täglich aktualisiert)
  • Findet nur Dateien, die im Index enthalten sind
whereis Suche nach Programmen
grep Dateiinhalte durchsuchen

Installation

find ist Teil des Pakets findutils

Aufruf

find [-H] [-L] [-P] [-D Fehlersuchoptionen] [-OStufe] [Startpunkt ] [Ausdruck]

Optionen

Option Parameter Beschreibung
-H
-L
-P
-D Fehlersuchoptionen
-O Stufe
Option Beschreibung
-name Sucht Dateien nach Dateinamen
-iname Sucht nach Dateinamen und ignoriert Groß- und Kleinschreibung
-size Sucht Dateien, die größer oder kleiner als größer sind
-type Sucht Dateien eines bestimmten Typs
-atime Sucht Dateien, auf die seit mehr oder weniger als X Tagen nicht mehr zugegriffen wurde
-amin Sucht Dateien, auf die seit mehr oder weniger als X Minuten nicht mehr zugegriffen wurde
-mtime Sucht Dateien, die seit mehr oder weniger als X Tagen nicht mehr verändert wurden
-mmin Sucht Dateien, die seit mehr oder weniger als X Minuten nicht mehr verändert wurden
-perm Sucht Dateien nach Zugriffsrechten
-user Sucht Dateien des Benutzers Benutzername
-inode Sucht Dateien nach Inode
Option Beschreibung
-exec Führt Befehl mit den gefundenen Dateien als Parameter aus
-ok Führt Befehl nach Rückfrage aus

Argumente

Umgebungsvariablen

Exit-Status

Anhang

Siehe auch


Dokumentation

Man-Page
  1. chmod(1)
  2. locate(1)
  3. ls(1)
  4. xargs(1)
  5. lstat(2)
  6. stat(2)
  7. ctime(3)
  8. fnmatch(3)
  9. printf(3)
  10. strftime(3)
  11. regex(7)
  12. find (1)
Info-Page

Links

Projekt

Weblinks