Find/Anwendungen: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 628: Zeile 628:
Löscht die gefundenen Dateien
Löscht die gefundenen Dateien


; Achtung!
; Achtung
Da find auch Unterverzeichnisse durchsucht, sollte mit dieser Option vorsichtig umgegangen werden
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
* Mit find gelöschte Dateien landen nicht im Papierkorb und können nicht wieder hergestellt werden

Version vom 23. Dezember 2024, 14:23 Uhr

Anwendungen

Alle Dateien im aktuellen und allen Unterverzeichnissen (rekursiv)

$ find 

Alle Dateien und Verzeichnissen im Unterverzeichnis foo des aktuellen Verzeichnisses

$ find foo

Suchbereich

Startverzeichnis

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 ab root (/)

$ find /
  • Sucht im Wurzelverzeichnis alle Dateien und alle Unterverzeichnisse
  • das kann je nach Größe des Dateisystems und der gemounteten Dateisysteme dauern

Verzeichnistiefe

Sie können die Ergebnisse von find mit der Option -maxdepth einschränken

  • Wenn Sie zum Beispiel jede JavaScript-Datei in Ihrem Wordpress-Verzeichnis finden wollen, würden Sie Folgendes verwenden:
find wordpress -name '*js'

Was aber, wenn Sie nur sehen wollen, ob es JavaScript-Dateien im obersten Verzeichnis gibt?

  • Das können Sie mit -maxdepth einschränken: find wordpress -maxdepth 1 -name '*js'
  • Damit wird nur das wordpress-Verzeichnis durchsucht, nicht aber die Unterverzeichnisse
  • Eine Änderung von -maxdepth auf 2 würde Unterverzeichnisse im wordpress-Verzeichnis durchsuchen, aber deren Unterverzeichnisse ausschließen
$ 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 angewandt

-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

Verzeichnisse ausschließen

Symbolische 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 angewandt, 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 angewandt, 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

Dateiname

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, 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

-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)

b
c
d
p
f
l
s
Finde nur Dateien
$ 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

Zeitstempel

Datum/Zeit

Dateien nach Zeitstempeln suchen
-amin N auf die Datei ist vor N Minuten zugegriffen worden
-anewer Referenzdatei auf die Datei ist vor weniger Zeit zugegriffen worden, als seit der letzten Veränderung der Referenzdatei vergangen ist
-atime N auf die Datei ist vor N*24 Stunden zugegriffen worden
-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
-ctime N der Dateistatus wurde vor N*24 Stunden geändert
-mmin N der Inhalt der Datei wurde vor N Minuten verändert
-mtime N der Inhalt der Datei wurde vor N*24 Stunden verändert
-newer Referenzdatei die Datei ist später verändert worden als die Referenzdatei
Argumente N
+ N wird interpretiert "alle Zahlen größer als N"
- N wird interpretiert "alle Zahlen kleiner als N"
N wird interpretiert "genau N"
Beispiele
$ find /tmp ! -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/Datei: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 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

misst 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 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 Bit zu ignorieren
  • Das heißt, es spielt keine Rolle, wenn die Datei auch beschreibbar oder lesbar ist, solange die Bit gesetzt sind, die sie ausführbar machen
  • Um die Suche auf Dateien einzuschränken, die exakt dem angegeben Staus entsprechen, benutzt du nicht den - -Operator

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

$ find -type f -perm /110

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

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

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

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

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

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

-perm +Modus

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

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

Links

-links Anzahl

Findet Dateien, auf die Anzahl fester Links zeigen

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

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

-lname Muster

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

-inum IN

die Datei belegt die Inode mit der Nummer N

find all the hard links

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

  • Using “ls ‑li 'file” will tell you how many hard links the file has, and the inode number
  • You can locate all pathnames to this file with:
find mount-point -xdev -inum inode-number
  • Since hard links are restricted to a single filesystem, you need to search that whole filesystem so you start the search at the 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
( 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 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
Kombination mit 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 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. – rozcietrzewiacz 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 – derobert Aug 24 '12 at 16:52

-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

Erweiterte Anwendungen

The “‑print” action lists the names of files separated by a newline
  • But it is common to pipe the output of find into xargs, which uses a space to separate file names
  • This can lead to problems if any found files contain spaces in their names, as the output doesn't use any quoting
  • In such cases, when the output of find contains a file name such as “foo bar” and is piped into another command, that command “sees” two file names, not one file name containing a space
  • Even without using xargs, you could have a problem if the file name contains a newline character, as most utilities expect one file name per line
  • In such cases, you can specify the action “‑print0” instead
  • This lists the found files separated not with a newline but with a null (or “”) character, which is not a legal character in Unix or Linux file names
  • Of course the command that reads the output of find must be able to handle such a list of file names
  • Many commands commonly used with find (such as tar or cpio) have special options to read in file names separated with NULs instead of spaces
  • Instead of having find list the files, it can run some command for each file found, using the “‑exec” action
  • The ‑exec is followed by some shell command line, ended with a semicolon (“;</nowiki>”)

(The semicolon must be quoted from the shell, so find can see it!) Within that command line, the word “{}” will expand out to the name of the found file

  • See below for some examples
  • You can use shell-style wildcards in the ‑name search argument: find . -name foo\*bar
  • This will search from the current directory down for foo*bar (that is, any filename that begins with foo and ends with bar)
  • Note that wildcards in the name argument must be quoted so the shell doesn't expand them before passing them to find
  • Also, unlike regular shell wildcards, these will match leading periods in filenames. (For example “find ‑name \*.txt” would match “.foo.txt”.)
  • You can search for other criteria beside the name
  • Also you can list multiple search criteria
  • When you have multiple criteria, any found files must match all listed criteria
  • That is, there is an implied Boolean AND operator between the listed search criteria. find also allows OR and NOT Boolean operators, as well as grouping, to combine search criteria in powerful ways (not shown here.)
  • Here's an example using two search criteria: find / -type f -mtime -7 | xargs tar -rf weekly_incremental.tar gzip weekly_incremental.tar
  • will find any regular files (i.e., not directories or other special files) with the criterion “‑type f”, and only those modified seven or fewer days ago (“‑mtime ‑7”)
  • Note the use of xargs, a handy utility that coverts a stream of input (in this case the output of find) into command line arguments for the supplied command (in this case tar, used to create a backup archive)
  • Using the tar option “‑c” is dangerous here; xargs may invoke tar several times if there are many files found, and each “‑c” will cause tar to over-write the previous invocation
  • The “‑r” option appends files to an archive
  • Other options such as those that would permit filenames containing spaces would be useful in a “production quality” backup script
  • Another use of xargs is illustrated below
  • This command will efficiently remove all files named core from your system (provided you run the command as root of course): find / -name core | xargs /bin/rm -f find / -name core -exec /bin/rm -f '{}' \; # same thing find / -name core -delete # same if using Gnu find</nowiki>
  • The last two forms run the rm command once per file, and are not as efficient as the first form; but they are safer if file names contain spaces or newlines
  • The first form can be made safer if rewritten to use “‑print0” instead of (the default) “‑print”. “‑exec” can be used more efficiently (see Using ‑execEfficiently below), but doing so means running the command once with many file names passed as arguments, and so has the same safety issues as with xargs
  • One of my favorite of the find criteria is used to locate files modified less than 10 minutes ago
  • I use this right after using some system administration tool, to learn which files got changed by that tool: find / -mmin -10
  • This search is also useful when I've downloaded some file but can't locate it, only in that case “‑cmin” may work better
  • Keep in mind neither of these criteria is standard; “‑mtime” and “‑ctime” are standard, but use days and not minutes
  • Another common use is to locate all files owned by a given user (“‑user 'username”)
  • This is useful when deleting user accounts
  • You can also find files with various permissions set. “‑perm /'permissions” means to find files with any of the specified permissions on, “‑perm -'permissions” means to find files with all of the specified permissions on, and “‑perm 'permissions” means to find files with exactly permissions. Permissions can be specified either symbolically (preferred) or with an octal number
  • The following will locate files that are writable by “others” (including symlinks, which should be writable by all): find . -perm -o=w

(Using ‑perm is more complex than this example shows

  • You should check both the POSIX documentation for find (which explains how the symbolic modes work) and the Gnu findman page (which describes the Gnu extensions)
  • When using find to locate files for backups, it often pays to use the “‑depth” option (really a criterion that is always true), which forces the output to be depth-first—that is, files first and then the directories containing them
  • This helps when the directories have restrictive permissions, and restoring the directory first could prevent the files from restoring at all (and would change the time stamp on the directory in any case)
  • Normally, find returns the directory first, before any of the files in that directory
  • This default behavior is useful when using the “‑prune” action to prevent find from examining any files you want to ignore:
  • find / -name /dev -prune ...other criteria | xargs tar
  • Using just “find / ‑name /dev ‑prune | xargs tar ...” won't work as most people might expect
  • This says to only find files named “/dev”, and then (if a directory) don't descend into it. So you only get the single directory name “/dev”! A better plan is to use the following: find / ! -path /dev\* |xargs
  • which says find everything except pathnames that start with “/dev”. The “!” means Boolean NOT
  • When specifying time with find options such as ‑mmin (minutes) or ‑mtime (24 hour periods, starting from now), you can specify a number “n” to mean exactly n, “‑n” to mean less than n, and “+n” to mean more than n
  • Fractional 24-hour periods are truncated! That means that “find ‑mtime +1” says to match files modified two or more days ago.
  • For example: find . -mtime 0 # find files modified between now and 1 day ago</nowiki> # (i.e., within the past 24 hours)</nowiki> find . -mtime -1 # find files modified less than 1 day ago</nowiki> # (i.e., within the past 24 hours, as before)</nowiki> find . -mtime 1 # find files modified between 24 and 48 hours ago</nowiki> find . -mtime +1 # find files modified more than 48 hours ago</nowiki> find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago</nowiki>

Weitere Lösungen

$ find -type f -printf '%T@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10 find -type f -printf '%T@ %p\n' | sort -k1 -n find -type f -print0 | xargs -0 stat -c "%y %n" | sort find -type f -print0 | xargs -0 stat -f "%m %Sm %N" | sort -rn

If you have not GNU utilities, you could use newlines as separators instead of nulls, but you'll lose support for filenames containing newlines

$ find -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' 

Compare Filetree

$ find directory1 -type d -printf "%P\n" | sort > file1 find directory2 -type d -printf "%P\n" | sort | diff – file1

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

Verwenden Sie den Schalter prune, wenn Sie z. B. das Verzeichnis misc ausschließen wollen, fügen Sie einfach ein -path ./misc -prune -o zu Ihrem find-Befehl hinzu: find . -pfad ./misc -prune -o -name '*.txt' -print

  • Hier ist ein Beispiel mit mehreren Verzeichnissen: find . -type d \( -pfad dir1 -o -pfad dir2 -o -pfad dir3 \) -prune -o -print find / \( -pfad /etc -o -pfad /dev -o -pfad /proc -o -pfad /sys \) -prune -o -name fstab -print
  • Hier schließen wir dir1, dir2 und dir3 aus, da es sich bei find-Ausdrücken um eine Aktion handelt, die auf die Kriterien -pfad dir1 -o -pfad dir2 -o -pfad dir3 (wenn dir1 oder dir2 oder dir3) wirkt, UNDiert mit Typ -d
  • Weitere Aktion ist -o print, nur print.* sollte nicht finden . -name ./misc
  • gefunden werden. -pfad ./misc ...?
  • Hmm
  • Das funktioniert bei mir auch nicht, da es das ignorierte Verzeichnis "./misc" in die Ausgabe einbezieht
  • Versuchen Sie, misc statt ./misc zu verwenden, das hat bei mir funktioniert
  • Wahrscheinlich hat es bei Ihnen nicht funktioniert, weil Sie nicht explizit ein -print (oder eine andere Aktion) nach -name hinzugefügt haben
  • In diesem Fall werden beide "Seiten" von -o gedruckt, während bei Verwendung von -print nur diese Seite gedruckt wird
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