Find: Unterschied zwischen den Versionen

Aus Foxwiki
Subpages:
Keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
V.31 (11.11.2020)
V.31 (11.11.2020)


= {{anchor|RefHeading339881143486078}} Linux- GNU Find =
= Linux- GNU Find =


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


<div style="margin-left:0cm;margin-right:0cm;">find [PFAD...] [AUSDRUCK...]</div>
find [PFAD...] [AUSDRUCK...]


find ist ein äußerst mächtiges Instrument zum Suchen von Dateien.  
find ist ein äußerst mächtiges Instrument zum Suchen von Dateien.  
Zeile 23: Zeile 23:
Die Option -name Dateiname ermöglicht dies. 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.
Die Option -name Dateiname ermöglicht dies. 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.


<div style="margin-left:0cm;margin-right:0cm;">'''find /usr -maxdepth 3 -name "XF*"'''
'''find /usr -maxdepth 3 -name "XF*"'''
/usr/X11R6/bin/XF86_Mach64
  /usr/X11R6/bin/XF86_Mach64
/usr/X11R6/bin/XF86Setup
  /usr/X11R6/bin/XF86Setup
/usr/X11R6/bin/XF86_VGA16
  /usr/X11R6/bin/XF86_VGA16
/usr/X11R6/bin/XFCom_Cyrix
  /usr/X11R6/bin/XFCom_Cyrix
/usr/X11R6/bin/XFCom_Matrox
  /usr/X11R6/bin/XFCom_Matrox
/usr/X11R6/bin/XFCom_Trident </div>
  /usr/X11R6/bin/XFCom_Trident  


Dateien verfügen über viele Eigenschaften. Sie haben einen Besitzer, Rechte, mehrere Zeitstempel, einen Typ, usw. Für jede dieser Eigenschaften existieren Optionen, mit denen sich gezielt Dateien bestimmter Charakteristik herausfischen lassen.  
Dateien verfügen über viele Eigenschaften. Sie haben einen Besitzer, Rechte, mehrere Zeitstempel, einen Typ, usw. Für jede dieser Eigenschaften existieren Optionen, mit denen sich gezielt Dateien bestimmter Charakteristik herausfischen lassen.  
Zeile 35: Zeile 35:
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].
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].


==== {{anchor|RefHeading13006977924429}} Implementierungen ====
==== Implementierungen ====


Nicht alle Implementierungen von <tt>find</tt> sind gleich. Der Befehl <tt>find</tt> ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X. Ein Großteil der Syntax von <tt>find</tt> ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig.  
Nicht alle Implementierungen von <tt>find</tt> sind gleich. Der Befehl <tt>find</tt> ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X. Ein Großteil der Syntax von <tt>find</tt> ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig.  
Zeile 43: Zeile 43:
Version of find:
Version of find:


<div style="margin-left:0cm;margin-right:0cm;">'''$ find --version'''
'''$ find --version'''
find (GNU findutils) 4.4.2</div>
  find (GNU findutils) 4.4.2


==== Alternativen ====
==== Alternativen ====
Zeile 64: Zeile 64:
Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen, siehe [http://wiki.ubuntuusers.de/ls ls] und [http://wiki.ubuntuusers.de/Shell/grep Shell/grep].
Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen, siehe [http://wiki.ubuntuusers.de/ls ls] und [http://wiki.ubuntuusers.de/Shell/grep Shell/grep].


== {{anchor|RefHeading7019539995267}} Grundlegende Verwendung ==
== Grundlegende Verwendung ==


find - sucht in einer Verzeichnishierarchie nach Dateien  
find - sucht in einer Verzeichnishierarchie nach Dateien  


<div style="margin-left:0cm;margin-right:0cm;">find [-H] [-L] [-P] [Verzeichnis...] [Ausdruck] </div>
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).  
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).  
Zeile 76: Zeile 76:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -name filename</div>
find -name filename


Angenommen ''filename'' existiert, dann wird <tt>find</tt> den Speicherort der Datei/Dateien anzeigen.  
Angenommen ''filename'' existiert, dann wird <tt>find</tt> den Speicherort der Datei/Dateien anzeigen.  
Zeile 82: Zeile 82:
Wie etwa hier:
Wie etwa hier:


<div style="margin-left:0cm;margin-right:0cm;">'''find -name filename'''
'''find -name filename'''
./projects/filename</div>
  ./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 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:


<div style="margin-left:0cm;margin-right:0cm;">find [Optionen] [Verzeichnisse] [Kriterium] [Handlung]</div>
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.  
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.  
Zeile 99: Zeile 99:
The syntax looks like this:  
The syntax looks like this:  


<div style="margin-left:0cm;margin-right:0cm;">find ''where-to-look criteria what-to-do''</div>
find ''where-to-look criteria what-to-do''


All arguments to <tt>find</tt> are optional, and there are defaults for all parts.  
All arguments to <tt>find</tt> are optional, and there are defaults for all parts.  
Zeile 111: Zeile 111:
For example:  
For example:  


<div style="margin-left:0cm;margin-right:0cm;">find</div>
find


will display the pathnames of all files in the current directory and all subdirectories.&nbsp; The commands  
will display the pathnames of all files in the current directory and all subdirectories.&nbsp; The commands  


<div style="margin-left:0cm;margin-right:0cm;">find . -print
find . -print
find -print
  find -print
find .</div>
  find .


do the exact same thing.&nbsp; Here's an example <tt>find</tt> command using a search criterion and the default action:  
do the exact same thing.&nbsp; Here's an example <tt>find</tt> command using a search criterion and the default action:  


<div style="margin-left:0cm;margin-right:0cm;">find / -name foo</div>
find / -name foo


This will search the whole system for any files named <tt>foo</tt> and display their pathnames.
This will search the whole system for any files named <tt>foo</tt> and display their pathnames.
Zeile 127: Zeile 127:
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:  
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:  


<div style="margin-left:0cm;margin-right:0cm;">/home/wpollock/foo
/home/wpollock/foo
/home/ua02/foo
  /home/ua02/foo
/tmp/foo</div>
  /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 <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.
Zeile 139: Zeile 139:
A good way to deal with this problem is to redirect the error messages so you don't have to see them at all:  
A good way to deal with this problem is to redirect the error messages so you don't have to see them at all:  


<div style="margin-left:0cm;margin-right:0cm;">find / -name foo '''2>/dev/null'''</div>
find / -name foo '''2>/dev/null'''


You can specify as many places to search as you wish:  
You can specify as many places to search as you wish:  


<div style="margin-left:0cm;margin-right:0cm;">find /tmp /var/tmp . $HOME -name foo</div>
find /tmp /var/tmp . $HOME -name foo


=== {{anchor|RefHeading5688100347735}} Ausdrücke  ===
=== 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).  
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).  
Zeile 153: Zeile 153:
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.  
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.  


=== {{anchor|RefHeading18714469115403}} Exit Status ===
=== Exit Status ===


Der Status von find ist Null, wenn alle Aktionen erfolgreich waren, im Fehlerfall ist der Status größer als Null.
Der Status von find ist Null, wenn alle Aktionen erfolgreich waren, im Fehlerfall ist der Status größer als Null.


=== {{anchor|RefHeading4342100347735}} Tests ===
=== Tests ===


Ein Kriterium kann einen oder mehrere atomare Tests umfassen.  
Ein Kriterium kann einen oder mehrere atomare Tests umfassen.  


==== {{anchor|RefHeadingToc5430498221824}} -true  ====
==== -true  ====


ist immer wahr  
ist immer wahr  


==== {{anchor|RefHeadingToc5392498221824}} -false  ====
==== -false  ====


ist immer falsch  
ist immer falsch  


=== {{anchor|RefHeading18704469115403}} Optionen ===
=== Optionen ===


'''Sollten am Anfang des Ausdrucks stehen'''
'''Sollten am Anfang des Ausdrucks stehen'''
Zeile 181: Zeile 181:
Eine Warnung wird ausgegeben, wenn Sie das nicht machen.  
Eine Warnung wird ausgegeben, wenn Sie das nicht machen.  


==== {{anchor|RefHeadingToc5374498221824}} -noleaf  ====
==== -noleaf  ====


erzwingt die Bearbeitung aller Verzeichniseinträge
erzwingt die Bearbeitung aller Verzeichniseinträge
Zeile 187: Zeile 187:
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  
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
* .. 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  
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  


==== {{anchor|RefHeading529831158963051}} Suche abbrechen ====
==== Suche abbrechen ====


Es besteht aber die Möglichkeit, eine Suche abzubrechen, sobald im Verzeichnis- oder Dateinamen ein bestimmtes Textmuster enthalten ist.  
Es besteht aber die Möglichkeit, eine Suche abzubrechen, sobald im Verzeichnis- oder Dateinamen ein bestimmtes Textmuster enthalten ist.  
Zeile 198: Zeile 196:
Dem jeweiligen Suchkriterium ("-name" oder "-path") ist die Option -prune hinten an zu stellen:
Dem jeweiligen Suchkriterium ("-name" oder "-path") ist die Option -prune hinten an zu stellen:


<div style="margin-left:0cm;margin-right:0cm;"><nowiki># Anzeige alle Dateien "-print", deren Name nicht mit einem Punkt beginnt</nowiki>
<nowiki># Anzeige alle Dateien "-print", deren Name nicht mit einem Punkt beginnt</nowiki>
  find . -path './.*' -prune -o -print
  find . -path './.*' -prune -o -print
  .
  .
  ./nsmail
  ./nsmail
  ./iglinux.tgz
  ./iglinux.tgz
  ./linuxbuch </div>
  ./linuxbuch  


=== {{anchor|RefHeading7158315101596}} Suchkriterien ===
=== Suchkriterien ===


Alle numerischen Argumente können auf drei Arten angegeben werden:  
Alle numerischen Argumente können auf drei Arten angegeben werden:  




{| style="border-spacing:0;margin:auto;width:17.51cm;"
{| class="wikitable sortable"  
|-
|-
| style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | '''+ N '''
| | '''+ N '''
| style="border:0.05pt solid #000000;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | steht für alle Zahlen größer als N  
| | steht für alle Zahlen größer als N  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | '''- N '''
| | '''- N '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | steht für alle Zahlen kleiner als N  
| | steht für alle Zahlen kleiner als N  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | '''N '''
| | '''N '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.15cm;padding-bottom:0.15cm;padding-left:0.349cm;padding-right:0.349cm;" | steht für genau N  
| | steht für genau N  
|-
|-
|}
|}
Zeile 229: Zeile 227:
* Dann können auch für die Dateien der alten Dateisysteme alle drei Zeitmarken unterschieden werden.  
* Dann können auch für die Dateien der alten Dateisysteme alle drei Zeitmarken unterschieden werden.  


 
=== Suchbereich ===
 
==== Startverzeichnis(se) ====
=== {{anchor|RefHeadingToc5811201713809}} Suchbereich ===
 
==== {{anchor|RefHeading7164315101596}} Startverzeichnis(se) ====


Suche nach allen Dateien und allen Unterverzeichnissen im aktuellen Verzeichnis:  
Suche nach allen Dateien und allen Unterverzeichnissen im aktuellen Verzeichnis:  


<div style="margin-left:0cm;margin-right:0cm;">find </div>
find  


Suche nach allen Dateien und Verzeichnissen im Unterverzeichnis '''foo''' des aktuellen Verzeichnisses:  
Suche nach allen Dateien und Verzeichnissen im Unterverzeichnis '''foo''' des aktuellen Verzeichnisses:  


<div style="margin-left:0cm;margin-right:0cm;">find foo </div>
find foo  


Suche alle Dateien und Verzeichnisse im übergeordneten Verzeichnis:  
Suche alle Dateien und Verzeichnisse im übergeordneten Verzeichnis:  


<div style="margin-left:0cm;margin-right:0cm;">find ../  </div>
find ../   


Suche in einem ganz anderen Verzeichnis beginnen (im absoluten Pfad '''/tmp'''):  
Suche in einem ganz anderen Verzeichnis beginnen (im absoluten Pfad '''/tmp'''):  


<div style="margin-left:0cm;margin-right:0cm;">find /tmp  </div>
find /tmp   


Suche in zwei Verzeichnissen (sucht sowohl in '''/tmp''' als auch in '''/boot'''):  
Suche in zwei Verzeichnissen (sucht sowohl in '''/tmp''' als auch in '''/boot'''):  


<div style="margin-left:0cm;margin-right:0cm;">find /tmp /boot </div>
find /tmp /boot  


Suche überall (Sucht im Wurzelverzeichnis alle Dateien und alle Unterverzeichnisse - das kann dauern!):  
Suche überall (Sucht im Wurzelverzeichnis alle Dateien und alle Unterverzeichnisse - das kann dauern!):  


<div style="margin-left:0cm;margin-right:0cm;">find / </div>
find /  


==== {{anchor|RefHeading11792977924429}} Verzeichnistiefe  ====
==== Verzeichnistiefe  ====


<div style="margin-left:0cm;margin-right:0cm;">find -maxdepth 3 </div>
find -maxdepth 3  


steigt bei der Suche nur 3 Verzeichnisebenen herab.
steigt bei der Suche nur 3 Verzeichnisebenen herab.


===== {{anchor|RefHeading7021139995267}} Limit Searches =====
===== 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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find wordpress -name '*js'</div>
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''':
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''':


<div style="margin-left:0cm;margin-right:0cm;">find wordpress -maxdepth 1 -name '*js'
find wordpress -maxdepth 1 -name '*js'
     </div>
      


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


===== {{anchor|RefHeadingToc5366498221824}} -depth  =====
===== -depth  =====


bearbeitet den Inhalt jedes Verzeichnisses vor dem Verzeichnis selbst.  
bearbeitet den Inhalt jedes Verzeichnisses vor dem Verzeichnis selbst.  


===== {{anchor|RefHeadingToc5370498221824}} -maxdepth Ebenen  =====
===== -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  
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  
Zeile 290: Zeile 285:
Suche nach Dateien, die sich maximal n Verzeichnisebenen unter dem angegebenen Verzeichnis befinden.
Suche nach Dateien, die sich maximal n Verzeichnisebenen unter dem angegebenen Verzeichnis befinden.


===== {{anchor|RefHeadingToc5372498221824}} -mindepth Ebenen  =====
===== -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  
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  
Zeile 298: Zeile 293:
Gehe mindestens <n> Verzeichnisebenen unter das angegebene Verzeichnis zurück, bevor die Suche gestartet wird.
Gehe mindestens <n> Verzeichnisebenen unter das angegebene Verzeichnis zurück, bevor die Suche gestartet wird.


==== {{anchor|RefHeading48441884156278}} Verzeichnisse ausschließen ====
==== 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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find . -path ./misc -prune -o -name '*.txt' -print</div>
find . -path ./misc -prune -o -name '*.txt' -print


Here is an example with multiple directories:
Here is an example with multiple directories:


<div style="margin-left:0cm;margin-right:0cm;">find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print</div>
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
<div style="margin-left:0cm;margin-right:0cm;">find / \( -path /etc -o -path /dev -o -path /proc -o -path /sys \) -prune -o -name fstab -print </div>
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 ...?  
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 ...?  
Zeile 318: Zeile 313:
===== All answers using -prune are wrong. The right way is: =====
===== All answers using -prune are wrong. The right way is: =====


<div style="margin-left:0cm;margin-right:0cm;">find -name "*.js" -not -path "./directory/*"</div>* 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. –
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.
* 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. :-)  
* It still traverses all of the unwanted directory, though. I'm adding my own answer. :-)  
Zeile 326: Zeile 321:




==== {{anchor|RefHeading5686100347735}} Umgang mit symbolischen Links ====
==== 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.  
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.  
Zeile 366: Zeile 361:




===== {{anchor|RefHeadingToc5368498221824}} -follow  =====
===== -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.  
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.  
Zeile 374: Zeile 369:
==== Dateisysteme ====
==== Dateisysteme ====


===== {{anchor|RefHeadingToc5376498221824}} -xdev  =====
===== -xdev  =====


durchsucht keine Verzeichnisse in anderen Dateisystemen/Partitionen
durchsucht keine Verzeichnisse in anderen Dateisystemen/Partitionen


===== {{anchor|RefHeadingToc5394498221824}} -fstype Typ  =====
===== -fstype Typ  =====


die Datei ist in einem Dateisystem vom angegebenen Typ; unter anderem werden minix, msdos, ext und proc erkannt  
die Datei ist in einem Dateisystem vom angegebenen Typ; unter anderem werden minix, msdos, ext und proc erkannt  


=== {{anchor|RefHeading7168315101596}} Name ===
=== Name ===


Mit vollständigem Namen  
Mit vollständigem Namen  


<div style="margin-left:0cm;margin-right:0cm;">find -name hausarbeit.odt</div>
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.
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.


<div style="margin-left:0cm;margin-right:0cm;">find -name "*.pdf"  </div>
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.
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.


<div style="margin-left:0cm;margin-right:0cm;">find -iname "a*.pdf"  </div>
find -iname "a*.pdf"   


Sucht im aktuellen Verzeichnis nach '''.pdf'''- und '''.PDF'''-Dateien, die mit <tt>a</tt> oder <tt>A</tt> beginnen.  
Sucht im aktuellen Verzeichnis nach '''.pdf'''- und '''.PDF'''-Dateien, die mit <tt>a</tt> oder <tt>A</tt> beginnen.  


<div style="margin-left:0cm;margin-right:0cm;">find -name "katze.*"  </div>
find -name "katze.*"   


findet '''katze.jpg''', '''katze.png''', '''katze.txt''' usw.  
findet '''katze.jpg''', '''katze.png''', '''katze.txt''' usw.  


<div style="margin-left:0cm;margin-right:0cm;">find -name "katze.??g"  </div>
find -name "katze.??g"   


findet '''katze.jpg''', '''katze.png''' usw. Jedes Fragezeichen steht für ein einzelnes Zeichen.
findet '''katze.jpg''', '''katze.png''' usw. Jedes Fragezeichen steht für ein einzelnes Zeichen.


<div style="margin-left:0cm;margin-right:0cm;">find -name "*foo*.*x*"  </div>
find -name "*foo*.*x*"   


findet '''foo.x''', '''afoo.x''', '''foob.txt''' usw.  
findet '''foo.x''', '''afoo.x''', '''foob.txt''' usw.  
Zeile 418: Zeile 413:
Findet Dateien mit Name, wie <tt>-name</tt>, ignoriert jedoch Groß- und Kleinschreibung.
Findet Dateien mit Name, wie <tt>-name</tt>, ignoriert jedoch Groß- und Kleinschreibung.


==== {{anchor|RefHeading4354100347735}} -path Name ====
==== -path Name ====


Findet Dateien mit Name, wobei Name auch Pfadangaben enthalten kann ("*/include/*.h")
Findet Dateien mit Name, wobei Name auch Pfadangaben enthalten kann ("*/include/*.h")
Zeile 426: Zeile 421:
Der Parameter '-path' ist hier die Lösung, denn er erlaubt die Interpretation des Zeichens '/'.  
Der Parameter '-path' ist hier die Lösung, denn er erlaubt die Interpretation des Zeichens '/'.  


<div style="margin-left:0cm;margin-right:0cm;">find -path "*2013/J*" </div>
find -path "*2013/J*"  


findet '''~/fotos/2013/Juni''' und '''~/musik/2013/Juli''', aber nicht '''~/dokumente/2013-Juni'''
findet '''~/fotos/2013/Juni''' und '''~/musik/2013/Juli''', aber nicht '''~/dokumente/2013-Juni'''


==== {{anchor|RefHeading11798977924429}} Reguläre Ausdrücke ====
==== Reguläre Ausdrücke ====


<tt>find</tt> hat nicht nur einfach RegEx-Support, es beherrscht auch mehrere unterschiedliche Arten der RegEx-Syntax.  
<tt>find</tt> hat nicht nur einfach RegEx-Support, es beherrscht auch mehrere unterschiedliche Arten der RegEx-Syntax.  
Zeile 438: Zeile 433:
Ein kurze Beispiel. Sagen wir ich suche alle Dateien die entweder eine .php oder .js Endung. Ich könnte das folgende laufen lassen:
Ein kurze Beispiel. Sagen wir ich suche alle Dateien die entweder eine .php oder .js Endung. Ich könnte das folgende laufen lassen:


<div style="margin-left:0cm;margin-right:0cm;">find -regextype posix-egrep -regex '.*(php|js)$'</div>* die egrep-Syntax <tt>-regextype posix-egrep</tt> zu benutzen und hinten kommt der Reguläre Ausdruck nach dem gesucht wird.  
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 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.  
* 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.  
Zeile 447: Zeile 442:




===== {{anchor|RefHeading4396100347735}} -regex Muster =====
===== -regex Muster =====


Wie "-name", nur kann das Muster reguläre Ausdrücke enthalten
Wie "-name", nur kann das Muster reguläre Ausdrücke enthalten


===== {{anchor|RefHeadingToc5426498221824}} -regex Muster  =====
===== -regex Muster  =====


der Pfadname passt zu dem regulären Ausdruck Muster  
der Pfadname passt zu dem regulären Ausdruck Muster  
Zeile 459: Zeile 454:
Wie <tt>-name</tt>, jedoch wird hier <tt>Muster</tt> als re­gulärer Ausdruck behandelt.
Wie <tt>-name</tt>, jedoch wird hier <tt>Muster</tt> als re­gulärer Ausdruck behandelt.


===== {{anchor|RefHeading4398100347735}} -iregex Muster =====
===== -iregex Muster =====


Wie „-regex“ jedoch ohne Groß-/keinschreibung zu beachten
Wie „-regex“ jedoch ohne Groß-/keinschreibung zu beachten
Zeile 467: Zeile 462:
Wie <tt>-regex</tt>, ignoriert aber Groß- und Kleinschreibung.  
Wie <tt>-regex</tt>, ignoriert aber Groß- und Kleinschreibung.  


===== {{anchor|RefHeading4400100347735}} -regextype type =====
===== -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
Ä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


=== {{anchor|RefHeading7166315101596}} Dateitypen ===
=== Dateitypen ===


==== {{anchor|RefHeading4348100347735}} -type Typ ====
==== -type Typ ====


Findet Dateien eines bestimmten Types
Findet Dateien eines bestimmten Types




{| style="border-spacing:0;width:17.494cm;"
{|  
|-
|-
| style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | b  
| | b  
| style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | c  
| | c  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | d  
| | d  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | p  
| | p  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | f  
| | f  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | l  
| | l  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.097cm;" | s  
| | s  
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:none;border-right:none;padding:0.097cm;" |  
| |  




Zeile 506: Zeile 501:
===== Finde nur Dateien  =====
===== Finde nur Dateien  =====


<div style="margin-left:0cm;margin-right:0cm;">find -type f  </div>
find -type f   


Das <tt>f</tt> steht für 'files'. Findet keine Verzeichnisse, aber alle herkömmlichen Dateien in allen Unterverzeichnissen.
Das <tt>f</tt> steht für 'files'. Findet keine Verzeichnisse, aber alle herkömmlichen Dateien in allen Unterverzeichnissen.
Zeile 512: Zeile 507:
===== Finde nur Verzeichnisse  =====
===== Finde nur Verzeichnisse  =====


<div style="margin-left:0cm;margin-right:0cm;">find -type d  </div>
find -type d   


Das <tt>d</tt> steht für 'directories'. Findet alle Unterverzeichnisse, aber keine sonstigen Dateien.
Das <tt>d</tt> steht für 'directories'. Findet alle Unterverzeichnisse, aber keine sonstigen Dateien.


==== {{anchor|RefHeadingToc5432498221824}} -type C  ====
==== -type C  ====


die Datei ist vom Typ C; folgende Typen werden unterschieden:  
die Datei ist vom Typ C; folgende Typen werden unterschieden:  
Zeile 522: Zeile 517:
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  
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  


==== {{anchor|RefHeadingToc5440498221824}} -xtype C  ====
==== -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  
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  
Zeile 530: Zeile 525:
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).
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).


=== {{anchor|RefHeading7174315101596}} Datum/Zeit ===
=== Datum/Zeit ===


==== Zeitstempel von Dateien ====
==== Zeitstempel von Dateien ====
Zeile 592: Zeile 587:
For example, let's look for any files that have not been modified in the last two days:
For example, let's look for any files that have not been modified in the last two days:


<div style="margin-left:0cm;margin-right:0cm;">find -mtime +2</div>
find -mtime +2


The options take a number that is interpreted as "n times 24 hours ago" and actually encompass a range. If you say +1, <tt>find</tt> will interpret that as "at least 24 hours ago, but not more than 48 hours ago."
The options take a number that is interpreted as "n times 24 hours ago" and actually encompass a range. If you say +1, <tt>find</tt> will interpret that as "at least 24 hours ago, but not more than 48 hours ago."
Zeile 614: Zeile 609:
Beim Versuch mittels chmod oder touch auf den Inode des Softlinks zuzugreifen, wird statt dessen dem Link gefolgt und der Zugriff erfolgt dort auf den Inode der verlinkten Datei.  
Beim Versuch mittels chmod oder touch auf den Inode des Softlinks zuzugreifen, wird statt dessen dem Link gefolgt und der Zugriff erfolgt dort auf den Inode der verlinkten Datei.  


==== {{anchor|RefHeading4370100347735}} Tage ====
==== Tage ====


<div style="margin-left:0cm;margin-right:0cm;">find -mtime -365 </div>
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)
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)
Zeile 627: Zeile 622:
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.  
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.  


==== {{anchor|RefHeadingToc5412498221824}} -newer Referenzdatei  ====
==== -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  
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  


==== {{anchor|RefHeadingToc5436498221824}} -used N  ====
==== -used N  ====


auf die Datei ist N Tage nach der letzten Änderung zugegriffen worden  
auf die Datei ist N Tage nach der letzten Änderung zugegriffen worden  


==== {{anchor|RefHeading4378100347735}} -atime Tage ====
==== -atime Tage ====


Findet Dateien, auf die vor Tagen zugegriffen wurden (zur Angabe von Bereichen siehe Option "amin")
Findet Dateien, auf die vor Tagen zugegriffen wurden (zur Angabe von Bereichen siehe Option "amin")
Zeile 643: Zeile 638:
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.
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.


==== {{anchor|RefHeadingToc5382498221824}} -atime N  ====
==== -atime N  ====


auf die Datei ist vor N*24 Stunden zugegriffen worden  
auf die Datei ist vor N*24 Stunden zugegriffen worden  


==== {{anchor|RefHeadingToc5380498221824}} -anewer Referenzdatei  ====
==== -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  
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  
Zeile 655: Zeile 650:
Findet Dateien auf die später zugegriffen wurde als auf Datei <tt><Datei></tt>
Findet Dateien auf die später zugegriffen wurde als auf Datei <tt><Datei></tt>


==== {{anchor|RefHeading4380100347735}} -amin Minuten ====
==== -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".
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".


==== {{anchor|RefHeadingToc5378498221824}} -amin N  ====
==== -amin N  ====


auf die Datei ist vor N Minuten zugegriffen worden  
auf die Datei ist vor N Minuten zugegriffen worden  
Zeile 671: Zeile 666:
So if you want to look for something that was changed or accessed in the last day, you can use those options.
So if you want to look for something that was changed or accessed in the last day, you can use those options.


<div style="margin-left:0cm;margin-right:0cm;">find -amin -5 </div>
find -amin -5  


nach Dateien suchen, auf die in den letzten 5 Minuten zugegriffen wurde. Analog: <tt>-cmin</tt>, <tt>-mmin</tt>.
nach Dateien suchen, auf die in den letzten 5 Minuten zugegriffen wurde. Analog: <tt>-cmin</tt>, <tt>-mmin</tt>.


==== {{anchor|RefHeading4376100347735}} Alle Dateien, auf die in der letzten Minute zugegriffen wurde ====
==== 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
Um die nachfolgende Suche erfolgreich enden zu lassen, manipulieren wir mit Hilfe von "touch" die Zugriffszeiten einiger Dateien


<div style="margin-left:0cm;margin-right:0cm;">'''touch sax*
'''touch sax*
  find . -amin 1
  find . -amin 1
  .'''
  .'''
  ./saxsys.tgz
  ./saxsys.tgz
  ./sax_logo.gif</div>
  ./sax_logo.gif


==== -ctime <n>, -cmin <n>, -cnewer <Datei> ====
==== -ctime <n>, -cmin <n>, -cnewer <Datei> ====
Zeile 689: Zeile 684:
Genau wie <tt>-atime</tt>, <tt>-amin</tt> und <tt>-anewer</tt>, doch in Bezug auf die letzte Inhaltsänderung der Datei.
Genau wie <tt>-atime</tt>, <tt>-amin</tt> und <tt>-anewer</tt>, doch in Bezug auf die letzte Inhaltsänderung der Datei.


==== {{anchor|RefHeadingToc5388498221824}} -ctime N  ====
==== -ctime N  ====


der Dateistatus wurde vor N*24 Stunden geändert  
der Dateistatus wurde vor N*24 Stunden geändert  


==== {{anchor|RefHeadingToc5384498221824}} -cmin N  ====
==== -cmin N  ====


der Status der Datei wurde vor N Minuten geändert  
der Status der Datei wurde vor N Minuten geändert  


==== {{anchor|RefHeadingToc5386498221824}} -cnewer Referenzdatei  ====
==== -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  
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  


===== {{anchor|RefHeading4374100347735}} Vergleich  =====
===== Vergleich  =====


<div style="margin-left:0cm;margin-right:0cm;">find -cnewer /tmp/referenz </div>
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.
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.


==== {{anchor|RefHeading4382100347735}} -mtime Tage ====
==== -mtime Tage ====


Findet Dateien, die vor Tagen geändert wurden (zur Angabe von Bereichen siehe Option »amin«)
Findet Dateien, die vor Tagen geändert wurden (zur Angabe von Bereichen siehe Option »amin«)


==== {{anchor|RefHeadingToc5408498221824}} -mtime N  ====
==== -mtime N  ====


der Inhalt der Datei wurde vor IN*24 Stunden verändert  
der Inhalt der Datei wurde vor IN*24 Stunden verändert  


==== {{anchor|RefHeadingToc5406498221824}} -mmin N  ====
==== -mmin N  ====


der Inhalt der Datei wurde vor N Minuten verändert  
der Inhalt der Datei wurde vor N Minuten verändert  


==== {{anchor|RefHeadingToc5364498221824}} -daystart  ====
==== -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.  
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.  
Zeile 727: Zeile 722:
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).
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).


=== {{anchor|RefHeading7172315101596}} Größe ===
=== 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.  
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.  
Zeile 737: Zeile 732:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -size 100k</div>
find -size 100k


Damit werden alle Dateien der Größe 100 kB gefunden. Das ist ziemlich speziell.  
Damit werden alle Dateien der Größe 100 kB gefunden. Das ist ziemlich speziell.  
Zeile 747: Zeile 742:
Mit dem <tt>-empty</tt>-Parameter kannst du auch leere Dateien finden:
Mit dem <tt>-empty</tt>-Parameter kannst du auch leere Dateien finden:


<div style="margin-left:0cm;margin-right:0cm;">find -empty -type -f </div>
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.
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.


==== {{anchor|RefHeading4368100347735}} -size Number[Einheit] ====
==== -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.  
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.  
Zeile 757: Zeile 752:
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.
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.


==== {{anchor|RefHeading4356100347735}} Maximale Größe  ====
==== Maximale Größe  ====


<div style="margin-left:0cm;margin-right:0cm;">find -size -100c -ls </div>
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.  
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.  
Zeile 765: Zeile 760:
Deswegen wird es hier, vor den anderen Aktionen, erwähnt.
Deswegen wird es hier, vor den anderen Aktionen, erwähnt.


==== {{anchor|RefHeading4358100347735}} Exakte Größe  ====
==== Exakte Größe  ====


<div style="margin-left:0cm;margin-right:0cm;">find -size 100c -ls </div>
find -size 100c -ls  


nach Dateien suchen, die genau 100 Bytes groß sind (kein Vorzeichen).  
nach Dateien suchen, die genau 100 Bytes groß sind (kein Vorzeichen).  


==== {{anchor|RefHeading4360100347735}} Mindestgröße  ====
==== Mindestgröße  ====


<div style="margin-left:0cm;margin-right:0cm;">find -size +100M </div>
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.
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.


==== {{anchor|RefHeading4362100347735}} Zwischen Mindest- und Maximalgröße  ====
==== Zwischen Mindest- und Maximalgröße  ====


<div style="margin-left:0cm;margin-right:0cm;">find -type f -size +64c -size -4096c | wc -l </div>
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.
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.


==== {{anchor|RefHeading4364100347735}} Blockgröße  ====
==== Blockgröße  ====


<div style="margin-left:0cm;margin-right:0cm;">find -size 10 </div>
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.
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.


==== {{anchor|RefHeading4366100347735}} Leeren Dateien  ====
==== Leeren Dateien  ====


Leere Verzeichnisse und Dateien der Größe 0  
Leere Verzeichnisse und Dateien der Größe 0  


<div style="margin-left:0cm;margin-right:0cm;">find -empty </div>
find -empty  


==== {{anchor|RefHeadingToc5390498221824}} -empty  ====
==== -empty  ====


die reguläre Datei oder das Verzeichnis ist leer  
die reguläre Datei oder das Verzeichnis ist leer  


==== {{anchor|RefHeadingToc5428498221824}} "size N[{c,k}]" ====
==== "size N[{c,k}]" ====


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


=== {{anchor|RefHeading11794977924429}} Besitzer und Gruppe ===
=== Besitzer und Gruppe ===


<div style="margin-left:0cm;margin-right:0cm;">find / -user BENUTZERNAME </div>
find / -user BENUTZERNAME  


==== {{anchor|RefHeading7019939995267}} Dateien nach Benutzer suchen ====
==== 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.  
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.  
Zeile 813: Zeile 808:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -nouser</div>
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.  
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.  
Zeile 821: Zeile 816:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -user root -o -user www-data</div>
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -not -user www-data</div>
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -user www-data -not -size +100k</div>
find -user www-data -not -size +100k


==== {{anchor|RefHeading4384100347735}} -user Nutzer ====
==== -user Nutzer ====


Findet Dateien des "Nutzers" (UID oder Nutzername)
Findet Dateien des "Nutzers" (UID oder Nutzername)


===== {{anchor|RefHeading4386100347735}} Alle Dateien im Verzeichnis /tmp, die »user« gehören =====
===== Alle Dateien im Verzeichnis /tmp, die »user« gehören =====


<div style="margin-left:0cm;margin-right:0cm;">'''find /tmp/ -user user 2>/dev/null'''
'''find /tmp/ -user user 2>/dev/null'''
/tmp/kfm-cache-500
  /tmp/kfm-cache-500
/tmp/kfm-cache-500/index.html
  /tmp/kfm-cache-500/index.html
/tmp/kfm-cache-500/index.txt
  /tmp/kfm-cache-500/index.txt
/tmp/acout.1364.NHKnJh
  /tmp/acout.1364.NHKnJh
/tmp/acin.1364.c36auh</div>
  /tmp/acin.1364.c36auh


==== {{anchor|RefHeading7020139995267}} Dateien nach Gruppen suchen (-group) ====
==== Dateien nach Gruppen suchen (-group) ====


Eine weitere Möglichkeit, nach Dateien zu suchen ist nach Gruppe, mit der <tt>-group</tt>-Option.  
Eine weitere Möglichkeit, nach Dateien zu suchen ist nach Gruppe, mit der <tt>-group</tt>-Option.  
Zeile 852: Zeile 847:
Die grundlegende Syntax ist  
Die grundlegende Syntax ist  


<tt>find -group groupname</tt>.
<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
Können mit anderen Operatoren kombiniert werden, um z.B. Dateien eines Benutzers zu finden, die auch zu einer bestimmten Gruppe gehören.s


==== {{anchor|RefHeadingToc5438498221824}} -user Name  ====
==== -user Name  ====


die Datei gehört dem Anwender Name  
die Datei gehört dem Anwender Name  


==== {{anchor|RefHeadingToc5434498221824}} -uid N  ====
==== -uid N  ====


die Kennziffer des Eigentümers ist N  
die Kennziffer des Eigentümers ist N  


==== {{anchor|RefHeadingToc5396498221824}} -gid N  ====
==== -gid N  ====


die Datei gehört der Gruppe mit der Kennzahl N  
die Datei gehört der Gruppe mit der Kennzahl N  


==== {{anchor|RefHeadingToc5398498221824}} -group Name  ====
==== -group Name  ====


die Datei gehört der Gruppe Name  
die Datei gehört der Gruppe Name  


==== {{anchor|RefHeadingToc5414498221824}} -nouser  ====
==== -nouser  ====


die Datei gehört keinem im System eingetragenen Benutzer  
die Datei gehört keinem im System eingetragenen Benutzer  


==== {{anchor|RefHeadingToc5416498221824}} -nogroup  ====
==== -nogroup  ====


die Datei gehört keiner im System angemeldeten Gruppe  
die Datei gehört keiner im System angemeldeten Gruppe  


=== {{anchor|RefHeading11796977924429}} Zugriffsrechte ===
=== Zugriffsrechte ===


Gelegentlich möchtest du dein Dateisystem nach Dateien überprüfen, die global beschreibbar sind, oder sonstige „falsche“ Berechtigungen haben.  
Gelegentlich möchtest du dein Dateisystem nach Dateien überprüfen, die global beschreibbar sind, oder sonstige „falsche“ Berechtigungen haben.  
Zeile 900: Zeile 895:
Zum Beispiel wenn du sehen willst welche Dateien von Benutzer und Gruppe ausführbar sind, nimmst du:
Zum Beispiel wenn du sehen willst welche Dateien von Benutzer und Gruppe ausführbar sind, nimmst du:


<div style="margin-left:0cm;margin-right:0cm;">find -type f -perm -110</div>
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.  
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.  
Zeile 910: Zeile 905:
Was, wenn du nach Dateien suchst die das Ausführen-Bit für Benutzer ''oder'' Gruppe haben? Dann nimmst du / statt - :
Was, wenn du nach Dateien suchst die das Ausführen-Bit für Benutzer ''oder'' Gruppe haben? Dann nimmst du / statt - :


<div style="margin-left:0cm;margin-right:0cm;">find -type f -perm /110</div>
find -type f -perm /110
 
Jede Datei, die die Gruppen- oder Eigentümer-Berechtigung hat, wird gefunden.
Jede Datei, die die Gruppen- oder Eigentümer-Berechtigung hat, wird gefunden.


Zeile 920: Zeile 915:
In diesem Fall ist das Lesen der <tt>man</tt>-Seiten nicht nur empfehlenswert, sondern unerlässlich.
In diesem Fall ist das Lesen der <tt>man</tt>-Seiten nicht nur empfehlenswert, sondern unerlässlich.


==== {{anchor|RefHeading4390100347735}} -perm Modus ====
==== -perm Modus ====


Findet Dateien, deren Rechte exakt dem angegebenem Modus entsprechen (Angabe numerisch oder symbolisch)
Findet Dateien, deren Rechte exakt dem angegebenem Modus entsprechen (Angabe numerisch oder symbolisch)
Zeile 926: Zeile 921:
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  
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  


==== {{anchor|RefHeading4392100347735}} -perm –Modus ====
==== -perm –Modus ====


Findet Dateien, bei denen mindestens die durch Modus angegebenen Rechteflags gesetzt sind
Findet Dateien, bei denen mindestens die durch Modus angegebenen Rechteflags gesetzt sind
Zeile 932: Zeile 927:
(mindestens) die Zugriffsrechte für den Modus sind gesetzt  
(mindestens) die Zugriffsrechte für den Modus sind gesetzt  


==== {{anchor|RefHeading4394100347735}} -perm +Modus ====
==== -perm +Modus ====


Findet Dateien, bei denen mindestens eines der durch Modus angegebenen Rechteflags gesetzt ist
Findet Dateien, bei denen mindestens eines der durch Modus angegebenen Rechteflags gesetzt ist
Zeile 938: Zeile 933:
die Zugriffsrechte entsprechen höchstens dem Modus (oder sind weiter eingeschränkt)  
die Zugriffsrechte entsprechen höchstens dem Modus (oder sind weiter eingeschränkt)  


=== {{anchor|RefHeading17244469115403}} Links ===
=== Links ===


==== {{anchor|RefHeading4402100347735}} -links Anzahl ====
==== -links Anzahl ====


Findet Dateien, auf die Anzahl fester Links zeigen
Findet Dateien, auf die Anzahl fester Links zeigen
Zeile 946: Zeile 941:
===== Dateien im Verzeichnis /usr mit 43 harten Links =====
===== Dateien im Verzeichnis /usr mit 43 harten Links =====


<div style="margin-left:0cm;margin-right:0cm;">'''find /usr/ -links 43 2>/dev/null'''
'''find /usr/ -links 43 2>/dev/null'''
/usr/include
  /usr/include
/usr/share </div>
  /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.  
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.  


==== {{anchor|RefHeadingToc5404498221824}} -lname Muster  ====
==== -lname Muster  ====


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


==== {{anchor|RefHeadingToc5400498221824}} -inum IN  ====
==== -inum IN  ====


die Datei belegt die Inode mit der Nummer N  
die Datei belegt die Inode mit der Nummer N  
Zeile 964: Zeile 959:
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:  
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:  


<div style="margin-left:0cm;margin-right:0cm;">find ''mount-point'' -xdev -inum ''inode-number''</div>
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.)  
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.)  
Zeile 974: Zeile 969:
Older Unix systems provided the “<tt>ncheck</tt>” utility instead that could be used for this.
Older Unix systems provided the “<tt>ncheck</tt>” utility instead that could be used for this.


== {{anchor|RefHeading2306761082722535}} Bedingungen verknüpfen ==
== Bedingungen verknüpfen ==


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


==== {{anchor|RefHeading4344100347735}} Tests kombinieren ====
==== 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></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.
Zeile 986: Zeile 981:




=== {{anchor|RefHeading18710469115403}} Operatoren ===
=== Operatoren ===


Die Optionen, Tests und Aktionen können mit Operatoren verknüpft werden.  
Die Optionen, Tests und Aktionen können mit Operatoren verknüpft werden.  
Zeile 993: Zeile 988:




{| style="border-spacing:0;margin:auto;width:17.501cm;"
{|  
|-
|-
| style="background-color:transparent;border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''( Ausdruck ) '''
| | '''( Ausdruck ) '''
| style="background-color:transparent;border:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | die Klammern fassen den Ausdruck zu einer Operation zusammen  
| | die Klammern fassen den Ausdruck zu einer Operation zusammen  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''! Ausdruck '''
| | '''! Ausdruck '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | ist wahr, wenn der Ausdruck falsch ist  
| | ist wahr, wenn der Ausdruck falsch ist  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''-not Ausdruck '''
| | '''-not Ausdruck '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | ist ebenfalls wahr, wenn der Ausdruck falsch ist  
| | ist ebenfalls wahr, wenn der Ausdruck falsch ist  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 Ausdruck2 '''
| | '''Ausdruck1 Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | UND Verknüpfung; wenn Ausdruck1 wahr ist, wird Ausdruck2 bewertet (ausgeführt)  
| | UND Verknüpfung; wenn Ausdruck1 wahr ist, wird Ausdruck2 bewertet (ausgeführt)  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 -a Ausdruck2 '''
| | '''Ausdruck1 -a Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | auch eine UND Verknüpfung  
| | auch eine UND Verknüpfung  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 -and Ausdruck2 '''
| | '''Ausdruck1 -and Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | auch eine UND Verknüpfung  
| | auch eine UND Verknüpfung  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 -o Ausdruck2 '''
| | '''Ausdruck1 -o Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | ODER Verknüpfung; Ausdruck2 wird bewertet (ausgeführt), wenn Ausdruck1 falsch ist  
| | ODER Verknüpfung; Ausdruck2 wird bewertet (ausgeführt), wenn Ausdruck1 falsch ist  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 -or Ausdruck2 '''
| | '''Ausdruck1 -or Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | auch eine ODER Verknüpfung  
| | auch eine ODER Verknüpfung  
|-
|-
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | '''Ausdruck1 , Ausdruck2 '''
| | '''Ausdruck1 , Ausdruck2 '''
| style="background-color:transparent;border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding-top:0.101cm;padding-bottom:0.101cm;padding-left:0.3cm;padding-right:0.3cm;" | Liste; beide Ausdrücke werden immer bewertet (ausgeführt); der Wahrheitswert des gesamten Ausdrucks entspricht dem von Ausdruck2  
| | Liste; beide Ausdrücke werden immer bewertet (ausgeführt); der Wahrheitswert des gesamten Ausdrucks entspricht dem von Ausdruck2  




|-
|-
|}
|}
=== {{anchor|RefHeading4406100347735}} Und-Kombination ===
=== Und-Kombination ===


Treffer müssen alle Kriterien erfüllen  
Treffer müssen alle Kriterien erfüllen  


<div style="margin-left:0cm;margin-right:0cm;">find -mindepth 3 -maxdepth 5</div>
find -mindepth 3 -maxdepth 5


Finde ab Unterverzeichnis(se) 3 (<tt>mindepth 3</tt>) UND bis Unterverzeichnis(se) 5 (<tt>-maxdepth 5</tt>).
Finde ab Unterverzeichnis(se) 3 (<tt>mindepth 3</tt>) UND bis Unterverzeichnis(se) 5 (<tt>-maxdepth 5</tt>).
Zeile 1.035: Zeile 1.030:
Weiters Beispiel der UND-Kombination:  
Weiters Beispiel der UND-Kombination:  


<div style="margin-left:0cm;margin-right:0cm;">find -mindepth 3 -type f -name "*.avi" -size +5M</div>
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>).  
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>).  


=== {{anchor|RefHeading4410100347735}} Oder-Kombination  ===
=== Oder-Kombination  ===


<div style="margin-left:0cm;margin-right:0cm;">find -name "susi.*" -or -name "susanne.*" </div>
find -name "susi.*" -or -name "susanne.*"  


Sucht alle Dateien die mit "susi." ODER "susanne." beginnen.
Sucht alle Dateien die mit "susi." ODER "susanne." beginnen.


=== {{anchor|RefHeading4408100347735}} ODER bzw. NICHT-Kombination ===
=== ODER bzw. NICHT-Kombination ===


Man kann die Suchoptionen aber auch per ODER bzw. NICHT verknüpfen:
Man kann die Suchoptionen aber auch per ODER bzw. NICHT verknüpfen:
Zeile 1.051: Zeile 1.046:
Negation  
Negation  


<div style="margin-left:0cm;margin-right:0cm;">find ! -name "*.avi" -not -name "*.mp*g" </div>
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.
Sucht Dateien die von der Dateiendung weder '''avi''', noch '''mpg''' oder '''mpeg''' sind. Ausrufezeichen und <tt>-not</tt> sind gleichbedeutend.


=== {{anchor|RefHeading4412100347735}} Klammerung ===
=== Klammerung ===


Bei umfangreichen Kombinationen kann eine Klammerung erforderlich sein, um das gewünschte Resultat zu erhalten.
Bei umfangreichen Kombinationen kann eine Klammerung erforderlich sein, um das gewünschte Resultat zu erhalten.
Zeile 1.061: Zeile 1.056:
==== ohne Klammern  ====
==== ohne Klammern  ====


<div style="margin-left:0cm;margin-right:0cm;">find -name "susi.*" -or -name "susanne.*" -name "*.txt"  </div>
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.  
Ohne Klammern wird erst die UND-Verbindung gebildet, also "susanne.*" und "*.txt", danach erst ODER "susi". '''susi.png''' würde also gefunden.  
Zeile 1.067: Zeile 1.062:
==== mit Klammern  ====
==== mit Klammern  ====


<div style="margin-left:0cm;margin-right:0cm;">find \( -name "susi.*" -or -name "susanne.*" \) -name "*.txt"  </div>
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.  
Klammern müssen maskiert werden. Hier wird jetzt für alle Dateien erfordert, dass diese auf .txt enden.  


=== {{anchor|RefHeading80071942887705}} Beispiel ===
=== Beispiel ===


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


<div style="margin-left:0cm;margin-right:0cm;">'''find . -maxdepth 1 \! -type d -a -perm +111 -a -user user'''
'''find . -maxdepth 1 \! -type d -a -perm +111 -a -user user'''
./.xinitrc
  ./.xinitrc
./.xsession
  ./.xsession
./dialog
  ./dialog
./selfeditor.pl </div>
  ./selfeditor.pl  


'''Erläuterung'''* Die Suche wurde auf das aktuelle Verzeichnis beschränkt "-maxdepth 1"
'''Erläuterung'''* Die Suche wurde auf das aktuelle Verzeichnis beschränkt "-maxdepth 1"
Zeile 1.088: Zeile 1.083:




== {{anchor|RefHeading149241942887705}} Aktionen  ==
== Aktionen  ==


=== {{anchor|RefHeadingToc5170498221824}} -ls  ===
=== -ls  ===


zeigt das Verzeichnis in dem die getestete Datei gefunden wurde mit ls -dils an  
zeigt das Verzeichnis in dem die getestete Datei gefunden wurde mit ls -dils an  


=== {{anchor|RefHeadingToc190371025091341}} -delete  ===
=== -delete  ===


Löscht die gefundenen Dateien  
Löscht die gefundenen Dateien  


==== {{anchor|RefHeading7182315101596}} 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.  
Zeile 1.108: Zeile 1.103:
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.  
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.  


<div style="margin-left:0cm;margin-right:0cm;">find test/ -name "c*" -delete  </div>
find test/ -name "c*" -delete   


Löscht im Verzeichnis '''test''' und dessen Unterverzeichnissen alle Dateien, die mit "c" beginnen.  
Löscht im Verzeichnis '''test''' und dessen Unterverzeichnissen alle Dateien, die mit "c" beginnen.  
Zeile 1.118: Zeile 1.113:
Wenn erst in den Unterverzeichnissen gelöscht wird kann ein leeres Oberverzeichnis auch gelöscht werden, umgekehrt nicht.
Wenn erst in den Unterverzeichnissen gelöscht wird kann ein leeres Oberverzeichnis auch gelöscht werden, umgekehrt nicht.


=== {{anchor|RefHeading7021339995267}} Find und anderen Kommandos  ===
=== Find und anderen Kommandos  ===


Now that you've found the files you're looking for, what are you going to do with them?  
Now that you've found the files you're looking for, what are you going to do with them?  
Zeile 1.128: Zeile 1.123:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find -user root -exec chown www-data {} \;</div>
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.
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.


==== {{anchor|RefHeading529851158963051}} Dateien bearbeiten ====
==== 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.  
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.  
Zeile 1.144: Zeile 1.139:
<u>Suche nach leeren Dateien und zeige diese mittels "ls -l" an</u>
<u>Suche nach leeren Dateien und zeige diese mittels "ls -l" an</u>


<div style="margin-left:0cm;margin-right:0cm;">find ./bsp/ -empty -exec ls -l \{\} \;
find ./bsp/ -empty -exec ls -l \{\} \;
insgesamt 0
  insgesamt 0
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/bla/file
-rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/foo/file </div>
  -rw-r--r--    1  user  users          0 Jun 16 09:30  ./bsp/lib/foo/file  


<u>Bemerkung</u>
<u>Bemerkung</u>
Zeile 1.162: Zeile 1.157:
Das Zeichen ; terminiert den von find aufzurufenden Shellbefehl, damit es nicht unbeabsichtigt von der Shell interpretiert wird muss es mit \ maskiert werden.  
Das Zeichen ; terminiert den von find aufzurufenden Shellbefehl, damit es nicht unbeabsichtigt von der Shell interpretiert wird muss es mit \ maskiert werden.  


==== {{anchor|RefHeadingToc5152498221824}} -exec Kommando; << ====
==== -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.
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.
Zeile 1.172: Zeile 1.167:
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  
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  


==== {{anchor|RefHeading4414100347735}} Using ‑exec Efficiently ====
==== Using ‑exec Efficiently ====


The <tt>‑exec</tt> action takes a command (along with its options) as an argument.
The <tt>‑exec</tt> action takes a command (along with its options) as an argument.
Zeile 1.184: Zeile 1.179:
Here's a somewhat contrived example, that for each found file replaces “Mr.” with “Mr. or Ms.”, and also converts the file to uppercase:  
Here's a somewhat contrived example, that for each found file replaces “Mr.” with “Mr. or Ms.”, and also converts the file to uppercase:  


<div style="margin-left:0cm;margin-right:0cm;">find ''whatever...'' -exec sh -c 'sed "s/Mr\./Mr. or Ms./g" "{}" \'
find ''whatever...'' -exec sh -c 'sed "s/Mr\./Mr. or Ms./g" "{}" \'
       | tr "[:lower:]" "[:upper:]" >"{}.new"' \;</div>
       | 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.
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.
Zeile 1.191: Zeile 1.186:
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]:  
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]:  


<div style="margin-left:0cm;margin-right:0cm;">  find ''whatever...'' | xargs ''command''</div>
  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>:  
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>:  


<div style="margin-left:0cm;margin-right:0cm;">find . -name \*.txt | xargs cp /tmp  <nowiki># This won't work!</nowiki></div>
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.)  
(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.)  
Zeile 1.211: Zeile 1.206:
For example:  
For example:  


<div style="margin-left:0cm;margin-right:0cm;">find / -name core -exec /bin/rm -f '{}' +</div>
find / -name core -exec /bin/rm -f '{}' +


==== -execdir Kommando {} +  ====
==== -execdir Kommando {} +  ====
Zeile 1.223: Zeile 1.218:
As for the <tt>find</tt> command, you can also just add more <tt>-exec</tt> commands in a row:  
As for the <tt>find</tt> command, you can also just add more <tt>-exec</tt> commands in a row:  


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;</div>
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;


Note that this command is, in its result, equivalent of using  
Note that this command is, in its result, equivalent of using  


<div style="margin-left:0cm;margin-right:0cm;">chgrp -v new_group file '''&&''' chmod -v 770 file</div>
chgrp -v new_group file '''&&''' chmod -v 770 file


on each file.
on each file.
Zeile 1.233: Zeile 1.228:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)</div>
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]  
@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]  


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;</div>
find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;




Zeile 1.251: Zeile 1.246:
Meist empfiehlt sich <tt>-execdir</tt> statt <tt>-exec</tt>  
Meist empfiehlt sich <tt>-execdir</tt> statt <tt>-exec</tt>  


<div style="margin-left:0cm;margin-right:0cm;">find test -type d -exec tar -cjf archiv.bz2 {} \; </div>
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.  
<tt>-execdir</tt> führt das Kommando aus dem Verzeichnis heraus aus, in dem die Datei gefunden wird.  
Zeile 1.259: Zeile 1.254:
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.  
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.  


===== {{anchor|RefHeadingToc5160498221824}} -ok Kommando;  =====
===== -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  
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  
Zeile 1.269: Zeile 1.264:
==== -okdir  ====
==== -okdir  ====


<div style="margin-left:0cm;margin-right:0cm;">find -name "*pdf" -okdir xpdf {} \; </div>
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.  
<tt>-okdir</tt> fragt im Gegensatz zu <tt>-execdir</tt> vor jeder Datei nach, ob man wirklich die Aktion ausführen möchte.  
Zeile 1.275: Zeile 1.270:
===== Parallele Ausführung mit +  =====
===== Parallele Ausführung mit +  =====


<div style="margin-left:0cm;margin-right:0cm;">find -name "*pdf" -execdir md5sum {} +  </div>
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.  
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.  
Zeile 1.281: Zeile 1.276:
Dies ist dann sinnvoll, wenn das Kommando selbst mit mehreren Parametern zurechtkommt. Beispiele:  
Dies ist dann sinnvoll, wenn das Kommando selbst mit mehreren Parametern zurechtkommt. Beispiele:  


<div style="margin-left:0cm;margin-right:0cm;">find test -type f -execdir md5sum {} ";" </div>
find test -type f -execdir md5sum {} ";"  


ergibt:
ergibt:


<div style="margin-left:0cm;margin-right:0cm;">md5sum a
md5sum a
  md5sum b
  md5sum b
  md5sum c</div>
  md5sum c


Dagegen ergibt:  
Dagegen ergibt:  


<div style="margin-left:0cm;margin-right:0cm;">find test -type f -execdir md5sum {} +  
find test -type f -execdir md5sum {} +  
md5sum a b c </div>
  md5sum a b c  


Das + kann nur verwendet werden, wenn die geschweiften Klammern unmittelbar davor stehen.  
Das + kann nur verwendet werden, wenn die geschweiften Klammern unmittelbar davor stehen.  
Zeile 1.304: Zeile 1.299:
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.  
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.  


== {{anchor|RefHeadingToc190391025091341}} Ausgabe formatieren ==
== Ausgabe formatieren ==


=== {{anchor|RefHeadingToc5162498221824}} -print  ===
=== -print  ===


gibt den vollständigen Pfadnamen der getesteten Datei auf die Standardausgabe  
gibt den vollständigen Pfadnamen der getesteten Datei auf die Standardausgabe  


=== {{anchor|RefHeadingToc5154498221824}} -fprint Ausgabedatei  ===
=== -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  
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  
Zeile 1.318: Zeile 1.313:
Gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei "Datei"  
Gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei "Datei"  


=== {{anchor|RefHeadingToc5164498221824}} -print0  ===
=== -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  
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  


==== {{anchor|RefHeadingToc5156498221824}} -fprint0 Ausgabedatei  ====
==== -fprint0 Ausgabedatei  ====


schreibt den Namen der getesteten Datei in die Ausgabedatei und schließt die Ausgabe mit einem Nullbyte ab, wie -print0  
schreibt den Namen der getesteten Datei in die Ausgabedatei und schließt die Ausgabe mit einem Nullbyte ab, wie -print0  


=== {{anchor|RefHeadingToc190411025091341}} -printf ===
=== -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.  
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.  
Zeile 1.336: Zeile 1.331:
For example the following displays non-hidden (no leading dot) files in the current directory only (no subdirectories), with an custom output format:  
For example the following displays non-hidden (no leading dot) files in the current directory only (no subdirectories), with an custom output format:  


<div style="margin-left:0cm;margin-right:0cm;">find . -maxdepth 1 -name '[!.]*' -printf 'Name: %16f Size: %6s\n'</div>
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:  
“<tt>‑maxdepth</tt>” is a Gnu extension. On a modern, POSIX version of <tt>find</tt> you could use this:  


<div style="margin-left:0cm;margin-right:0cm;">find . -path './*' -prune ...</div>
find . -path './*' -prune ...


On any version of <tt>find</tt> you can use this more complex (but portable) code:  
On any version of <tt>find</tt> you can use this more complex (but portable) code:  


<div style="margin-left:0cm;margin-right:0cm;">find . ! -name . -prune ...</div>
find . ! -name . -prune ...


which says to “prune” (don't descend into) any directories except “<tt>.</tt>”.  
which says to “prune” (don't descend into) any directories except “<tt>.</tt>”.  
Zeile 1.350: Zeile 1.345:
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:  
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:  


<div style="margin-left:0cm;margin-right:0cm;"> find . \( -name . -o -prune \) ...</div>
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):  
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):  


<div style="margin-left:0cm;margin-right:0cm;">find / -noleaf -wholename '/proc' -prune \
find / -noleaf -wholename '/proc' -prune \
      -o -wholename '/sys' -prune \
      -o -wholename '/sys' -prune \
      -o -wholename '/dev' -prune \
      -o -wholename '/dev' -prune \
      -o -wholename '/windows-C-Drive' -prune \
      -o -wholename '/windows-C-Drive' -prune \
      -o -perm -2 ! -type l  ! -type s \
      -o -perm -2 ! -type l  ! -type s \
      ! \( -type d -perm -1000 \) -print</div>
      ! \( -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).  
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).  
Zeile 1.369: Zeile 1.364:
(Symlinks, sockets, and directories with the sticky bit set, are often world-writable and generally not suspicious.)  
(Symlinks, sockets, and directories with the sticky bit set, are often world-writable and generally not suspicious.)  


==== {{anchor|RefHeadingToc5166498221824}} -printf Format  ====
==== -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:  
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:  
Zeile 1.417: Zeile 1.412:
%U die Benutzerkennzahl des Eigentümers der getesteten Datei  
%U die Benutzerkennzahl des Eigentümers der getesteten Datei  


==== {{anchor|RefHeadingToc5158498221824}} -fprintf Ausgabedatei Format  ====
==== -fprintf Ausgabedatei Format  ====


schreibt den Namen der getesteten Datei in die Ausgabedatei und benutzt dabei das Format mit Sonderzeichen wie bei printf  
schreibt den Namen der getesteten Datei in die Ausgabedatei und benutzt dabei das Format mit Sonderzeichen wie bei printf  


=== {{anchor|RefHeadingToc5168498221824}} -prune  ===
=== -prune  ===


Wenn die Datei ein Verzeichnis ist, wird nicht in dieses hinabgestiegen. * wahr, wenn die Option -depth nicht angegeben ist
Wenn die Datei ein Verzeichnis ist, wird nicht in dieses hinabgestiegen. * wahr, wenn die Option -depth nicht angegeben ist
Zeile 1.428: Zeile 1.423:




=== {{anchor|RefHeading149261942887705}} Beispiele  ===
=== Beispiele  ===


Ohne weitere Angaben gibt find die Namen der gefundenen Dateien aus:  
Ohne weitere Angaben gibt find die Namen der gefundenen Dateien aus:  


<div style="margin-left:0cm;margin-right:0cm;">find /boot/grub/ -name "he*"  
find /boot/grub/ -name "he*"  
/boot/grub/hexdump.mod
  /boot/grub/hexdump.mod
/boot/grub/hello.mod
  /boot/grub/hello.mod
/boot/grub/help.mod  </div>
  /boot/grub/help.mod   


Wie bereits gesehen kann man mit <tt>-ls</tt> eine detailliertere Ausgabe erzeugen:  
Wie bereits gesehen kann man mit <tt>-ls</tt> eine detailliertere Ausgabe erzeugen:  


<div style="margin-left:0cm;margin-right:0cm;">find /boot/grub/ -name "he*" -ls  
find /boot/grub/ -name "he*" -ls  
168624    4 -rw-r--r--  1 root    root        3196 Jan 13 17:08 /boot/grub/hexdump.mod
  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
  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 </div>
  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.
Mit <tt>-exec</tt> und dessen Varianten lassen sich beliebige Programme auf den Fundstellen ausführen.
Zeile 1.448: Zeile 1.443:
Die Anzahl der Zeilen in Textdateien findet man mit <tt>wc -l DATEI</tt><nowiki>; kombiniert mit find sieht das so aus: </nowiki>
Die Anzahl der Zeilen in Textdateien findet man mit <tt>wc -l DATEI</tt><nowiki>; kombiniert mit find sieht das so aus: </nowiki>


<div style="margin-left:0cm;margin-right:0cm;">find -name "*.py" -exec wc -l {} \;  
find -name "*.py" -exec wc -l {} \;  
  10 ./x/abc.py
  10 ./x/abc.py
  6 ./x/date-form.py
  6 ./x/date-form.py
  102 ./x/download.py </div>
  102 ./x/download.py  


Das Kommando <tt>wc -l</tt> (Anzahl der Zeilen zählen) wird auf jede gefundene Datei angewendet.  
Das Kommando <tt>wc -l</tt> (Anzahl der Zeilen zählen) wird auf jede gefundene Datei angewendet.  
Zeile 1.463: Zeile 1.458:
Kombination mit <tt>-print</tt>  
Kombination mit <tt>-print</tt>  


<div style="margin-left:0cm;margin-right:0cm;">find tmp -name "a" -exec touch {} \; -print
find tmp -name "a" -exec touch {} \; -print
./tmp/a
  ./tmp/a
./tmp/a/a
  ./tmp/a/a
./tmp/a/a/a </div>
  ./tmp/a/a/a  


<tt>touch</tt> setzt das Datum der Dateien auf den Ausführungszeitpunkt.  
<tt>touch</tt> setzt das Datum der Dateien auf den Ausführungszeitpunkt.  
Zeile 1.472: Zeile 1.467:
Da touch aber nicht den Dateinamen ausgibt sieht man nicht, welche Dateien nun betroffen waren. Daher schickt man ein <tt>-print</tt> hinterher.
Da touch aber nicht den Dateinamen ausgibt sieht man nicht, welche Dateien nun betroffen waren. Daher schickt man ein <tt>-print</tt> hinterher.


== {{anchor|RefHeading2306821082722535}} Suche optimieren: xargs ==
== Suche optimieren: xargs ==


Sollen viele Dateien bearbeiten werden wird für jede Datei ein eigene Befehl abgesetzt. Findet <tt>find(1)</tt> nun 2000 Dateien des Users toelpel, werden (hintereinander) 2000 Prozesse gestartet, die jeweils eine Datei löschen.  
Sollen viele Dateien bearbeiten werden wird für jede Datei ein eigene Befehl abgesetzt. Findet <tt>find(1)</tt> nun 2000 Dateien des Users toelpel, werden (hintereinander) 2000 Prozesse gestartet, die jeweils eine Datei löschen.  
Zeile 1.486: Zeile 1.481:
Wenn viele Dateien (manchmal über den Verzeichnisbaum verteilt) gleichartig behandeln werden sollen, ob die Dateien nun gelöscht, der Eigentümer oder die Zugriffsrechte geändert werden soll, ist <tt>find(1)</tt> eine gute lösung.  
Wenn viele Dateien (manchmal über den Verzeichnisbaum verteilt) gleichartig behandeln werden sollen, ob die Dateien nun gelöscht, der Eigentümer oder die Zugriffsrechte geändert werden soll, ist <tt>find(1)</tt> eine gute lösung.  


<div style="margin-left:0cm;margin-right:0cm;">find / -user toelpel -exec rm  \{\} \;</div>
find / -user toelpel -exec rm  \{\} \;


=== {{anchor|RefHeading4418100347735}} Syntax ===
=== Syntax ===


xargs wird mit folgender Syntax in einem Terminal aufgerufen.
xargs wird mit folgender Syntax in einem Terminal aufgerufen.


<div style="margin-left:0cm;margin-right:0cm;">Kommando1 | xargs [Optionen] Kommando2 </div>
Kommando1 | xargs [Optionen] Kommando2  


Hierbei wird das "Kommando2" mit den Argumenten aufgerufen, die das "Kommando1" auf die Standardausgabe gibt.
Hierbei wird das "Kommando2" mit den Argumenten aufgerufen, die das "Kommando1" auf die Standardausgabe gibt.
Zeile 1.498: Zeile 1.493:
<tt>xargs(1)</tt> hat die Funktion Kommandozeilen aus Standard-Input zu erstellen und auszuführen.  
<tt>xargs(1)</tt> hat die Funktion Kommandozeilen aus Standard-Input zu erstellen und auszuführen.  


<div style="margin-left:0cm;margin-right:0cm;">find / -user toelpel -print | xargs rm</div>
find / -user toelpel -print | xargs rm


<tt>find(1)</tt> listet alle Dateien des Users toelpel auf und reicht sie über die Pipe an xargs weiter. <tt>xargs(1)</tt> nimmt die Liste von der Standardeingabe und bastelt daraus und aus dem <tt>rm(1)</tt>, was ihm als Argument übergeben wurde, ein <tt>rm(1)</tt>-Kommando mit 2000 Argumenten.  
<tt>find(1)</tt> listet alle Dateien des Users toelpel auf und reicht sie über die Pipe an xargs weiter. <tt>xargs(1)</tt> nimmt die Liste von der Standardeingabe und bastelt daraus und aus dem <tt>rm(1)</tt>, was ihm als Argument übergeben wurde, ein <tt>rm(1)</tt>-Kommando mit 2000 Argumenten.  
Zeile 1.504: Zeile 1.499:
Ergebnis: 3 Prozesse anstelle von 2001 Prozessen in der ersten Variante, um 2000 Dateien zu löschen.
Ergebnis: 3 Prozesse anstelle von 2001 Prozessen in der ersten Variante, um 2000 Dateien zu löschen.


=== {{anchor|RefHeading4420100347735}} Dateinamen mit Leerzeichen ===
=== Dateinamen mit Leerzeichen ===


Üblicher Weise enthält der IFS das Leerzeichen, daher bricht <tt>xargs </tt>die Dateinamen dort auseinander.  
Üblicher Weise enthält der IFS das Leerzeichen, daher bricht <tt>xargs </tt>die Dateinamen dort auseinander.  
Zeile 1.510: Zeile 1.505:
Dem ist abzuhelfen, wenn man die GNU-Version der benutzten Tools (find und xargs) verwendet. <tt>find(1)</tt> gibt man bekannt, er möge mit ASCII-NUL beendete Zeichenketten ausgeben, und xargs, er möge solche erwarten:
Dem ist abzuhelfen, wenn man die GNU-Version der benutzten Tools (find und xargs) verwendet. <tt>find(1)</tt> gibt man bekannt, er möge mit ASCII-NUL beendete Zeichenketten ausgeben, und xargs, er möge solche erwarten:


<div style="margin-left:0cm;margin-right:0cm;">find / -user toelpel -print0 | xargs -0 rm</div>
find / -user toelpel -print0 | xargs -0 rm


=== {{anchor|RefHeading4422100347735}} Eingabedatei als Parameter ===
=== Eingabedatei als Parameter ===


Sollen die Dateien verschoben werden, erwartet mv die Quelldateien als erstes, das Zielverzeichnis als letztes Argument. Dieses Problem löst man bei <tt>xargs(1)</tt> genauso wie bei <tt>find(1)</tt>:
Sollen die Dateien verschoben werden, erwartet mv die Quelldateien als erstes, das Zielverzeichnis als letztes Argument. Dieses Problem löst man bei <tt>xargs(1)</tt> genauso wie bei <tt>find(1)</tt>:


<div style="margin-left:0cm;margin-right:0cm;">find / -user toelpel -print0 | xargs -0 mv {} /tmp/toelpel-trash</div>
find / -user toelpel -print0 | xargs -0 mv {} /tmp/toelpel-trash


Die Zeichenkombination "{}" zeigt dem <tt>xargs(1)</tt>, an welcher Stelle er die Argumentliste für das Kommando einzufügen hat.  
Die Zeichenkombination "{}" zeigt dem <tt>xargs(1)</tt>, an welcher Stelle er die Argumentliste für das Kommando einzufügen hat.  


=== {{anchor|RefHeading4424100347735}} Optionen ===
=== Optionen ===




{| style="border-spacing:0;margin:auto;width:17.501cm;"
{|  
|-
|-
| style="border-top:0.05pt solid #000000;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-a [Datei]</tt> oder <tt>--arg-file=[Datei]</tt> '''
| | <tt>'''-a [Datei]</tt> oder <tt>--arg-file=[Datei]</tt> '''
| style="border:0.05pt solid #000000;padding:0.101cm;" | Liest die Argumente aus einer Datei anstatt von der Standardeingabe  
| | Liest die Argumente aus einer Datei anstatt von der Standardeingabe  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-0</tt> oder <tt>--null</tt> '''
| | <tt>'''-0</tt> oder <tt>--null</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Argumente werden aufgrund des NULL-Zeichens getrennt anstatt des Leerzeichen. Jedes Zeichen wird wörtlich genommen. Nützlich in Kombination mit der <tt>-print0</tt> Option von <tt>find</tt>.  
| | Argumente werden aufgrund des NULL-Zeichens getrennt anstatt des Leerzeichen. Jedes Zeichen wird wörtlich genommen. Nützlich in Kombination mit der <tt>-print0</tt> Option von <tt>find</tt>.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-d [Trennzeichen]</tt> oder <tt>--delimiter=[Trennzeichen]</tt> '''
| | <tt>'''-d [Trennzeichen]</tt> oder <tt>--delimiter=[Trennzeichen]</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Argumente werden aufgrund des Trennzeichens getrennt anstatt des Leerzeichens. Jedes Zeichen wird wörtlich genommen. Das Trennzeichen kann ein einzelnes Zeichen sein, ein escaptes Zeichen, ein oktaler oder ein hexadezimaler Code. Mehrere Zeichen sind nicht erlaubt.  
| | Argumente werden aufgrund des Trennzeichens getrennt anstatt des Leerzeichens. Jedes Zeichen wird wörtlich genommen. Das Trennzeichen kann ein einzelnes Zeichen sein, ein escaptes Zeichen, ein oktaler oder ein hexadezimaler Code. Mehrere Zeichen sind nicht erlaubt.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''--help</tt> '''
| | <tt>'''--help</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Hilfe anzeigen.  
| | Hilfe anzeigen.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-i'''</tt>
| | <tt>'''-i'''</tt>
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Standardmäßig wird "{}" als Ersatz-Zeichenkette verwendet, wie bei der Aktion <tt>-exec</tt> des Befehls <tt>find</tt>. xargs fügt dann die Dateiliste an der Stelle ein, wo die Ersatz-Zeichenkette steht. Dies kommt zur Anwendung wenn der Befehl die von xargs erzeugte Dateiliste nicht am Ende erwartet.
| | Standardmäßig wird "{}" als Ersatz-Zeichenkette verwendet, wie bei der Aktion <tt>-exec</tt> des Befehls <tt>find</tt>. xargs fügt dann die Dateiliste an der Stelle ein, wo die Ersatz-Zeichenkette steht. Dies kommt zur Anwendung wenn der Befehl die von xargs erzeugte Dateiliste nicht am Ende erwartet.
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-p</tt> oder <tt>--interactive</tt> '''
| | <tt>'''-p</tt> oder <tt>--interactive</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Fragt vor jeder Ausführung, ob fortgefahren werden soll.  
| | Fragt vor jeder Ausführung, ob fortgefahren werden soll.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-r</tt> oder <tt>--no-run-if-empty</tt> '''
| | <tt>'''-r</tt> oder <tt>--no-run-if-empty</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Führt "Kommando2" nicht aus, wenn die Standardeingabe keine Nicht-Leerzeichen enthält.  
| | Führt "Kommando2" nicht aus, wenn die Standardeingabe keine Nicht-Leerzeichen enthält.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-n</tt> oder <tt>--max-args</tt> '''
| | <tt>'''-n</tt> oder <tt>--max-args</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Führt "Kommando2" auf jeweils eine bestimmt Anzahl von übergebenen Argumenten aus.  
| | Führt "Kommando2" auf jeweils eine bestimmt Anzahl von übergebenen Argumenten aus.  
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-P</tt> oder <tt>--max-procs</tt> '''
| | <tt>'''-P</tt> oder <tt>--max-procs</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Führt "Kommando2" mehrfach aus. Mit der Kombination mit -n kann so eine bessere Auslastung des Systems erreicht werden.
| | Führt "Kommando2" mehrfach aus. Mit der Kombination mit -n kann so eine bessere Auslastung des Systems erreicht werden.
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.101cm;" | <tt>'''-t</tt> oder <tt>--verbose</tt> '''
| | <tt>'''-t</tt> oder <tt>--verbose</tt> '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.101cm;" | Gibt mehr Informationen darüber, was gemacht wird.  
| | Gibt mehr Informationen darüber, was gemacht wird.  




|-
|-
|}
|}
=== {{anchor|RefHeading4426100347735}} Beispiele ===
=== Beispiele ===


<div style="margin-left:0cm;margin-right:0cm;">find /tmp -name core -type f -print | xargs /bin/rm -f</div>
find /tmp -name core -type f -print | xargs /bin/rm -f


Finde Dateien mit dem Namen core in oder unterhalb des Verzeichnisses /tmp und lösche diese.  
Finde Dateien mit dem Namen core in oder unterhalb des Verzeichnisses /tmp und lösche diese.  
Zeile 1.570: Zeile 1.565:
Dabei werden Dateien, deren Namen Leerzeichen enthalten ebenfalls berücksichtigt:
Dabei werden Dateien, deren Namen Leerzeichen enthalten ebenfalls berücksichtigt:


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*.tmp" -print0 | xargs -0 rm </div>
find . -name "*.tmp" -print0 | xargs -0 rm  


Als nächstes eine Anwendung mit der Ersatz-Zeichenkette {}. Alle Dateien des Benutzers mit der uid 1001 werden nach '''/tmp/klaus/test''' verschoben.  
Als nächstes eine Anwendung mit der Ersatz-Zeichenkette {}. Alle Dateien des Benutzers mit der uid 1001 werden nach '''/tmp/klaus/test''' verschoben.  
Zeile 1.578: Zeile 1.573:
Die Verzeichnisstruktur wird dabei nicht wieder hergestellt. Die Dateien landen wirklich alle in '''/tmp/klaus/test'''.
Die Verzeichnisstruktur wird dabei nicht wieder hergestellt. Die Dateien landen wirklich alle in '''/tmp/klaus/test'''.


<div style="margin-left:0cm;margin-right:0cm;">find . -uid 1001 -print | xargs -i mv {} /tmp/klaus/test </div>
find . -uid 1001 -print | xargs -i mv {} /tmp/klaus/test  


Wenn man eine Datei '''software.list''' mit den Namen von Paketen hat, die sich im Verzeichnis '''~/installation/''' befindet und die wie folgt aufgebaut ist
Wenn man eine Datei '''software.list''' mit den Namen von Paketen hat, die sich im Verzeichnis '''~/installation/''' befindet und die wie folgt aufgebaut ist


<div style="margin-left:0cm;margin-right:0cm;">alltray
alltray
audacity
  audacity
avidemux
  avidemux
azureus
  azureus
compizconfig-settings-manager</div>
  compizconfig-settings-manager


kann man mit
kann man mit


<div style="margin-left:0cm;margin-right:0cm;">xargs -a ~/installation/software.list sudo apt-get install </div>
xargs -a ~/installation/software.list sudo apt-get install  


die Pakete komfortabel alle auf einmal installieren. Dabei werden bereits installierte Pakete übersprungen.
die Pakete komfortabel alle auf einmal installieren. Dabei werden bereits installierte Pakete übersprungen.
Zeile 1.596: Zeile 1.591:
Möchte man mehrere Dateien herunterladen, aber die Geschwindigkeit der Server lastet die eigene Internetverbindung nicht aus, so kann man mit xargs einfach mehrere Instanzen benutzen.
Möchte man mehrere Dateien herunterladen, aber die Geschwindigkeit der Server lastet die eigene Internetverbindung nicht aus, so kann man mit xargs einfach mehrere Instanzen benutzen.


<div style="margin-left:0cm;margin-right:0cm;">xargs -a downloadlist -n 1 -P 4 wget </div>
xargs -a downloadlist -n 1 -P 4 wget  


Dieser Befehl übergibt jeweils eine URL aus der Datei '''downloadlist''' an wget.  
Dieser Befehl übergibt jeweils eine URL aus der Datei '''downloadlist''' an wget.  
Zeile 1.604: Zeile 1.599:
So werden vier Dateien auf einmal heruntergeladen und die Internetverbindung optimal ausgenutzt.
So werden vier Dateien auf einmal heruntergeladen und die Internetverbindung optimal ausgenutzt.


==== {{anchor|RefHeading4428100347735}} Weitere Möglichkeiten ====
==== Weitere Möglichkeiten ====


This command is equivalent to using <tt>find</tt> with <tt>xargs</tt>, only a bit shorter and more efficient.  
This command is equivalent to using <tt>find</tt> with <tt>xargs</tt>, only a bit shorter and more efficient.  
Zeile 1.610: Zeile 1.605:
But this form of <tt>‑exec</tt> can be combined with a shell feature to solve the other problem (names with spaces). The POSIX shell allows us to use:  
But this form of <tt>‑exec</tt> can be combined with a shell feature to solve the other problem (names with spaces). The POSIX shell allows us to use:  


<div style="margin-left:0cm;margin-right:0cm;">sh -c '''command-line''' [ ''command-name'' [ ''args''... ] ]</div>
sh -c '''command-line''' [ ''command-name'' [ ''args''... ] ]


We don't usually care about the ''command-name'', so “X”, “dummy”, “”, or “'inline cmd'” is often used.
We don't usually care about the ''command-name'', so “X”, “dummy”, “”, or “'inline cmd'” is often used.
Zeile 1.616: Zeile 1.611:
Here's an example of efficiently copying found files to <tt>/tmp</tt>, in a POSIX-compliant way.  
Here's an example of efficiently copying found files to <tt>/tmp</tt>, in a POSIX-compliant way.  


<div style="margin-left:0cm;margin-right:0cm;">find . -name '*.txt' -type f \
find . -name '*.txt' -type f \
  -exec sh -c 'exec cp -f "$@" /tmp' X '{}' +</div>
    -exec sh -c 'exec cp -f "$@" /tmp' X '{}' +


Obvious, simple, and readable, isn't it?&nbsp; Perhaps not, but worth knowing since it is safe, portable, and efficient.
Obvious, simple, and readable, isn't it?&nbsp; Perhaps not, but worth knowing since it is safe, portable, and efficient.


== {{anchor|RefHeading5679977924429}} Anwendungen ==
== Anwendungen ==


=== {{anchor|RefHeading134011942887705}} Beispiel 1 ===
=== Beispiel 1 ===


Wo in meinem Homeordner liegt die Datei "test.pdf"?
Wo in meinem Homeordner liegt die Datei "test.pdf"?


<div style="margin-left:0cm;margin-right:0cm;">find ~ -name test.pdf</div>
find ~ -name test.pdf


Ihr habt vor ein paar Minuten eilig etwas gespeichert, habt aber den Namen der Datei und den Pfad sofort vergessen.
Ihr habt vor ein paar Minuten eilig etwas gespeichert, habt aber den Namen der Datei und den Pfad sofort vergessen.
Zeile 1.633: Zeile 1.628:
Irgendwo in eurem Homeordner, irgendein Name, vor ein paar Minuten...
Irgendwo in eurem Homeordner, irgendein Name, vor ein paar Minuten...


<div style="margin-left:0cm;margin-right:0cm;">find ~ -type f ! -path '*/.*' -mmin -10 -ls</div>
find ~ -type f ! -path '*/.*' -mmin -10 -ls


Die Optionen im Einzelnen:* ~ -- rekursiv in meinem Homeordner
Die Optionen im Einzelnen:* ~ -- rekursiv in meinem Homeordner
Zeile 1.647: Zeile 1.642:
Variante: mit Dotfiles, nicht aber Ordner, die mit Punkt beginnen (also ohne .gnome/ oder .kde/ usw., aber mit .bash_history). Und zwar alle Dateien, die nicht älter als zwei Tage sind.
Variante: mit Dotfiles, nicht aber Ordner, die mit Punkt beginnen (also ohne .gnome/ oder .kde/ usw., aber mit .bash_history). Und zwar alle Dateien, die nicht älter als zwei Tage sind.


<div style="margin-left:0cm;margin-right:0cm;">find ~ ! -path '*/.*/*' -type f -ctime -2</div>
find ~ ! -path '*/.*/*' -type f -ctime -2


Im Homeordner alle Dateien finden, deren Namen Leerzeichen enthalten.
Im Homeordner alle Dateien finden, deren Namen Leerzeichen enthalten.
Zeile 1.653: Zeile 1.648:
Wieder ohne Dateien oder Ordner, die mit Punkt beginnen.
Wieder ohne Dateien oder Ordner, die mit Punkt beginnen.


<div style="margin-left:0cm;margin-right:0cm;">find $HOME ! -path '*/.*' -type f -name '* *'</div>* $HOME -- ist gleichbedeutend mit ~
find $HOME ! -path '*/.*' -type f -name '* *'* $HOME -- ist gleichbedeutend mit ~
* -name '* *' -- Name enthält mindestens ein Leerzeichen
* -name '* *' -- Name enthält mindestens ein Leerzeichen




Zeile 1.660: Zeile 1.655:
Ganz ähnlich, aber diesmal wird nach Ordnern gesucht:
Ganz ähnlich, aber diesmal wird nach Ordnern gesucht:


<div style="margin-left:0cm;margin-right:0cm;">find $HOME ! -path '*/.*' -type d -name '* *'</div>
find $HOME ! -path '*/.*' -type d -name '* *'


-type d -- Ordner (type directory)
-type d -- Ordner (type directory)


Im Ordner public_html alle HTML und PHP Dateien ausfindig machen, in denen ".mp3" erwähnt wird.  
Im Ordner public_html alle HTML und PHP Dateien ausfindig machen, in denen ".mp3" erwähnt wird.  
Zeile 1.668: Zeile 1.663:
Nur die Dateinamen ausgeben.
Nur die Dateinamen ausgeben.


<div style="margin-left:0cm;margin-right:0cm;">find ~/public_html \( -name \*.html -o -name \*.php \) | xargs grep -l '.mp3'</div>
find ~/public_html \( -name \*.html -o -name \*.php \) | xargs grep -l '.mp3'


Zu beachten: ( ) * müssen vor der Bash versteckt, also mit Backslash escaped werden.
Zu beachten: ( ) * müssen vor der Bash versteckt, also mit Backslash escaped werden.
Zeile 1.674: Zeile 1.669:
Andere Methode (-exec statt xargs), gleiches Ergebnis.
Andere Methode (-exec statt xargs), gleiches Ergebnis.


<div style="margin-left:0cm;margin-right:0cm;">find ~/public_html \( -name \*.html -o -name \*.php \) -exec grep -l '.mp3' '{}' \+</div>
find ~/public_html \( -name \*.html -o -name \*.php \) -exec grep -l '.mp3' '{}' \+


Zu beachten: -exec mit''' \+''' abschließen statt mit '''\; '''beschleunigt das Abarbeiten ungemein, weil dann mehrere grep Prozesse parallell gestartet werden (vgl. xargs). Setzt eine halbwegs aktuelle Version von find voraus.
Zu beachten: -exec mit''' \+''' abschließen statt mit '''\; '''beschleunigt das Abarbeiten ungemein, weil dann mehrere grep Prozesse parallell gestartet werden (vgl. xargs). Setzt eine halbwegs aktuelle Version von find voraus.
Zeile 1.680: Zeile 1.675:
Hoppla, da sind auch Dateien mit Leerzeichen im Namen dabei? Kein Problem.
Hoppla, da sind auch Dateien mit Leerzeichen im Namen dabei? Kein Problem.


<div style="margin-left:0cm;margin-right:0cm;">find ~/public_html \( -name \*.html -o -name \*.php \) -print0 | xargs -0 grep -l '.mp3'</div>
find ~/public_html \( -name \*.html -o -name \*.php \) -print0 | xargs -0 grep -l '.mp3'


finds Option -print0 erzeugt die richtige Ausgabe für xargs Option -0
finds Option -print0 erzeugt die richtige Ausgabe für xargs Option -0
Zeile 1.688: Zeile 1.683:
Also z.B.: in meinem Homeordner alle Dateien, die größer als 500MB sind.
Also z.B.: in meinem Homeordner alle Dateien, die größer als 500MB sind.


<div style="margin-left:0cm;margin-right:0cm;">find ~ -size +500M</div>
find ~ -size +500M


Alle Dateien/Ordner in meinem Homeordner finden, die nicht mir gehören:
Alle Dateien/Ordner in meinem Homeordner finden, die nicht mir gehören:


<div style="margin-left:0cm;margin-right:0cm;">find ~ ! -user $( whoami ) -ls</div>
find ~ ! -user $( whoami ) -ls


Alle Dateien/Ordner in meinem Homeordner, die root gehören:
Alle Dateien/Ordner in meinem Homeordner, die root gehören:


<div style="margin-left:0cm;margin-right:0cm;">find ~ -user root</div>
find ~ -user root


Alle Dateien/Ordner in meinem Homeordner, die die Rechte auf 777 gesetzt haben,
Alle Dateien/Ordner in meinem Homeordner, die die Rechte auf 777 gesetzt haben,
Zeile 1.702: Zeile 1.697:
also Lese/Schreib/Ausführrechte für alle haben, lange Ausgabe wie "ls -l".
also Lese/Schreib/Ausführrechte für alle haben, lange Ausgabe wie "ls -l".


<div style="margin-left:0cm;margin-right:0cm;">find ~ -perm 777 -ls</div>
find ~ -perm 777 -ls


Welche Art von Dateien (Mimetype) liegen im Ordner Documents, mit Rücksicht auf Dateien mit Leerzeichen im Namen, nur in diesem Ordner, keine Unterordner:
Welche Art von Dateien (Mimetype) liegen im Ordner Documents, mit Rücksicht auf Dateien mit Leerzeichen im Namen, nur in diesem Ordner, keine Unterordner:


<div style="margin-left:0cm;margin-right:0cm;">find ~/Documents/ -maxdepth 1 -type f -print0 | xargs -0 file</div>
find ~/Documents/ -maxdepth 1 -type f -print0 | xargs -0 file


Find sucht immer rekursiv, es sei denn, man schränkt mit "-maxdepth" die Tiefe ein. Die Liste ließe sich beliebig fortsetzen. Wie vielseitig find ist, zeigt sich schon an der Länge der manpage.  
Find sucht immer rekursiv, es sei denn, man schränkt mit "-maxdepth" die Tiefe ein. Die Liste ließe sich beliebig fortsetzen. Wie vielseitig find ist, zeigt sich schon an der Länge der manpage.  
Zeile 1.712: Zeile 1.707:
Find findet nach Name, Regex, Größe, Datum, Dateityp,... usw. und läßt sich mit "-exec" und der Pipe für "xargs" zu beinahe allem verwenden, was nur auf bestimmte Dateien/Ordner angewendet werden soll. Darum wird das Kommando in vielen Shellskripten verwendet.
Find findet nach Name, Regex, Größe, Datum, Dateityp,... usw. und läßt sich mit "-exec" und der Pipe für "xargs" zu beinahe allem verwenden, was nur auf bestimmte Dateien/Ordner angewendet werden soll. Darum wird das Kommando in vielen Shellskripten verwendet.


=== {{anchor|RefHeading7015139995267}} [http://techblog.7d0.de/2009/01/beispiele-zur-benutzung-von-grep-und-find/ Beispiel] 2 ===
=== [http://techblog.7d0.de/2009/01/beispiele-zur-benutzung-von-grep-und-find/ Beispiel] 2 ===


Dateien im aktuellen Ordner und Unterordnern finden, deren Namen einem bestimmen Muster entsprechen:
Dateien im aktuellen Ordner und Unterordnern finden, deren Namen einem bestimmen Muster entsprechen:


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*.jpg"</div>
find . -name "*.jpg"


Dateien finden, deren Namen nicht einem bestimmten Muster entsprechen:
Dateien finden, deren Namen nicht einem bestimmten Muster entsprechen:


<div style="margin-left:0cm;margin-right:0cm;">find . \! -name "*.jpg"</div>
find . \! -name "*.jpg"


Dateien finden, deren Namen einem bestimmten Muster entsprechen und die einen bestimmten Text enthalten:
Dateien finden, deren Namen einem bestimmten Muster entsprechen und die einen bestimmten Text enthalten:


<div style="margin-left:0cm;margin-right:0cm;">find . -name "*.php" -exec grep -il "suchtext" {} \;</div>
find . -name "*.php" -exec grep -il "suchtext" {} \;


Dateien finden, die bestimmte Datei-Endungen haben (Mit Regular-Expressions finden):
Dateien finden, die bestimmte Datei-Endungen haben (Mit Regular-Expressions finden):


<div style="margin-left:0cm;margin-right:0cm;">find . -regex ".*(php|html|tpl)$"</div>
find . -regex ".*(php|html|tpl)$"


Große Dateien finden (Dateien finden, die größer als ca. 500 MB sind):
Große Dateien finden (Dateien finden, die größer als ca. 500 MB sind):


<div style="margin-left:0cm;margin-right:0cm;">find . -type f -size +500000k -exec ls -lh {} \;</div>
find . -type f -size +500000k -exec ls -lh {} \;


Dateien finden, deren Pfade einem bestimmten Pattern entsprechen:
Dateien finden, deren Pfade einem bestimmten Pattern entsprechen:


<div style="margin-left:0cm;margin-right:0cm;">find . -path "*/.svn*"</div>
find . -path "*/.svn*"


Dateien finden, deren Pfade nicht einem bestimmten Pattern entsprechen:
Dateien finden, deren Pfade nicht einem bestimmten Pattern entsprechen:


<div style="margin-left:0cm;margin-right:0cm;">find . \! -path "*/.svn*"</div>
find . \! -path "*/.svn*"


Dateien finden, die nicht einem bestimmten User (nicht root) gehören:
Dateien finden, die nicht einem bestimmten User (nicht root) gehören:


<div style="margin-left:0cm;margin-right:0cm;">find . \! -user root</div>
find . \! -user root


Dateien finden, die “oo” oder “ee” im Namen haben:
Dateien finden, die “oo” oder “ee” im Namen haben:


<div style="margin-left:0cm;margin-right:0cm;">find . \( -name "*oo*" -or -name "*ee*" \)</div>
find . \( -name "*oo*" -or -name "*ee*" \)


Dateien finden, die nicht “oo” oder “ee” im Namen haben:
Dateien finden, die nicht “oo” oder “ee” im Namen haben:


<div style="margin-left:0cm;margin-right:0cm;">find . \! \( -name "*oo*" -or -name "*ee*" \)</div>
find . \! \( -name "*oo*" -or -name "*ee*" \)


Geht nicht mit find (GNU findutils) 4.4.2:
Geht nicht mit find (GNU findutils) 4.4.2:


<div style="margin-left:0cm;margin-right:0cm;">'''find . -regex “.*(php|html|tpl)$”'''
'''find . -regex “.*(php|html|tpl)$”'''
mkdir /tmp/tst
  mkdir /tmp/tst
cd /tmp/tst
  cd /tmp/tst
mkdir -p 1/2/3
  mkdir -p 1/2/3
mkdir -p 4/5/6
  mkdir -p 4/5/6
touch la.php
  touch la.php
touch 1/2/uu.tpl
  touch 1/2/uu.tpl
touch 4/lala.html
  touch 4/lala.html
touch 4/5/6/eee.php
  touch 4/5/6/eee.php
touch 4/5/oooooo'
  touch 4/5/oooooo'
find . -regex “.*(php|html|tpl)$”</div>
  find . -regex “.*(php|html|tpl)$”


es wird nix ausgegeben :(
es wird nix ausgegeben :(


=== {{anchor|RefHeading4446100347735}} Beispiel 3 ===
=== Beispiel 3 ===


Angenommen, Sie möchten eine Liste der Verzeichnisse in <tt>/usr/share</tt> erhalten, dann tippen Sie:
Angenommen, Sie möchten eine Liste der Verzeichnisse in <tt>/usr/share</tt> erhalten, dann tippen Sie:


<div style="margin-left:0cm;margin-right:0cm;">find /usr/share -type d</div>
find /usr/share -type d


Angenommen, Sie haben einen HTTP-Server und alle Ihre HTML-Dateien befinden sich in <tt>/home/httpd/html</tt>, wo Sie sich auch gerade befinden. Sie möchten eine Liste aller Dateien, deren Inhalt seit einem Monat nicht verändert worden ist.  
Angenommen, Sie haben einen HTTP-Server und alle Ihre HTML-Dateien befinden sich in <tt>/home/httpd/html</tt>, wo Sie sich auch gerade befinden. Sie möchten eine Liste aller Dateien, deren Inhalt seit einem Monat nicht verändert worden ist.  
Zeile 1.784: Zeile 1.779:
[http://www.murnauer.de/mandrakeref/command-find.html#FTN.AEN4397 Denken Sie daran, dass in diesem Beispiel beide Verzeichnisse auf dem selben Dateisystem sein müssen!]]
[http://www.murnauer.de/mandrakeref/command-find.html#FTN.AEN4397 Denken Sie daran, dass in diesem Beispiel beide Verzeichnisse auf dem selben Dateisystem sein müssen!]]


<div style="margin-left:0cm;margin-right:0cm;">find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 -exec  
find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 -exec  
ln {} /home/httpd/obsolete \;</div>
  ln {} /home/httpd/obsolete \;


Gut, das hier ist etwas komplex und verlangt nach Erklärung. Das Suchkriterium ist Folgendes:
Gut, das hier ist etwas komplex und verlangt nach Erklärung. Das Suchkriterium ist Folgendes:


<div style="margin-left:0cm;margin-right:0cm;">\( -name "*.htm" -o -name "*.html" \) -a -ctime -30</div>
\( -name "*.htm" -o -name "*.html" \) -a -ctime -30


Es findet alle Dateien, die entweder auf <tt>.htm</tt> oder auf <tt>.html</tt> enden (<tt>( -name "*.htm" -o -name "*.html" )</tt>) und (<tt>-a</tt>) die in den letzten 30 Tagen nicht modifiziert wurden (<tt>-ctime -30</tt>). Beachten Sie die Klammern, die hier notwendig sind, da <tt>-a</tt> eine höhere Wertigkeit hat.  
Es findet alle Dateien, die entweder auf <tt>.htm</tt> oder auf <tt>.html</tt> enden (<tt>( -name "*.htm" -o -name "*.html" )</tt>) und (<tt>-a</tt>) die in den letzten 30 Tagen nicht modifiziert wurden (<tt>-ctime -30</tt>). Beachten Sie die Klammern, die hier notwendig sind, da <tt>-a</tt> eine höhere Wertigkeit hat.  
Zeile 1.801: Zeile 1.796:
Und schließlich das Kommando, das für jede gefundene Datei ausgeführt wird:
Und schließlich das Kommando, das für jede gefundene Datei ausgeführt wird:


<div style="margin-left:0cm;margin-right:0cm;">-exec ln {} /home/httpd/obsolete \;</div>
-exec ln {} /home/httpd/obsolete \;


Auch hier müssen Sie das <tt><nowiki>;</nowiki></tt> vor der Shell schützen, da diese es sonst als Kommandoseparator interpretiert und find sich beschweren wird, dass <tt>-exec</tt> ein Argument fehlt.  
Auch hier müssen Sie das <tt><nowiki>;</nowiki></tt> vor der Shell schützen, da diese es sonst als Kommandoseparator interpretiert und find sich beschweren wird, dass <tt>-exec</tt> ein Argument fehlt.  
Zeile 1.815: Zeile 1.810:
Da Sie die Dateien von verschiedenen Quellen haben, haben Sie die Endungen <tt>jpg</tt>, <tt>jpeg</tt>, <tt>JPG</tt> oder <tt>JPEG</tt>. Sie möchten nicht im Verzeichnis <tt>old</tt> suchen, Sie möchten diese Liste zugeschickt bekommen und Ihr Benutzername ist <tt>john</tt>:
Da Sie die Dateien von verschiedenen Quellen haben, haben Sie die Endungen <tt>jpg</tt>, <tt>jpeg</tt>, <tt>JPG</tt> oder <tt>JPEG</tt>. Sie möchten nicht im Verzeichnis <tt>old</tt> suchen, Sie möchten diese Liste zugeschickt bekommen und Ihr Benutzername ist <tt>john</tt>:


<div style="margin-left:0cm;margin-right:0cm;">find /shared/images -cnewer    \
find /shared/images -cnewer    \
      /shared/images/stamp      \
      /shared/images/stamp      \
      -a -iregex ".*\.jpe?g"    \
      -a -iregex ".*\.jpe?g"    \
      -a -not -regex ".*/old/.*" \
      -a -not -regex ".*/old/.*" \
        | mail john -s "Neue Images"</div>
        | mail john -s "Neue Images"


Nun wäre es nicht sehr schön, dieses Kommando regelmäßig neu eingeben zu müssen, also brauchen Sie…?
Nun wäre es nicht sehr schön, dieses Kommando regelmäßig neu eingeben zu müssen, also brauchen Sie…?


== {{anchor|RefHeading7028339995267}} Erweiterte Anwendungen ==
== Erweiterte Anwendungen ==


The “<tt>‑print</tt>” action lists the names of files separated by a newline.  
The “<tt>‑print</tt>” action lists the names of files separated by a newline.  
Zeile 1.847: Zeile 1.842:
You can use shell-style wildcards in the <tt>‑name</tt> search argument:  
You can use shell-style wildcards in the <tt>‑name</tt> search argument:  


<div style="margin-left:0cm;margin-right:0cm;">find . -name foo\*bar</div>
find . -name foo\*bar


This will search from the current directory down for <tt>foo*bar</tt> (that is, any filename that begins with <tt>foo</tt> and ends with <tt>bar</tt>).  
This will search from the current directory down for <tt>foo*bar</tt> (that is, any filename that begins with <tt>foo</tt> and ends with <tt>bar</tt>).  
Zeile 1.863: Zeile 1.858:
Here's an example using two search criteria:  
Here's an example using two search criteria:  


<div style="margin-left:0cm;margin-right:0cm;">find / '''-type f -mtime -7''' | xargs tar -rf weekly_incremental.tar
find / '''-type f -mtime -7''' | xargs tar -rf weekly_incremental.tar
gzip weekly_incremental.tar</div>
  gzip weekly_incremental.tar


will find any regular files (i.e., not directories or other special files) with the criterion “<tt>‑type f</tt>”, and only those modified seven or fewer days ago (“<tt>‑mtime ‑7</tt>”).  
will find any regular files (i.e., not directories or other special files) with the criterion “<tt>‑type f</tt>”, and only those modified seven or fewer days ago (“<tt>‑mtime ‑7</tt>”).  
Zeile 1.876: Zeile 1.871:
Another use of <tt>xargs</tt> is illustrated below. This command will efficiently remove all files named <tt>core</tt> from your system (provided you run the command as root of course):  
Another use of <tt>xargs</tt> is illustrated below. This command will efficiently remove all files named <tt>core</tt> from your system (provided you run the command as root of course):  


<div style="margin-left:0cm;margin-right:0cm;">find / -name core | xargs /bin/rm -f
find / -name core | xargs /bin/rm -f
  find / -name core -exec /bin/rm -f '{}' \; # same thing
  find / -name core -exec /bin/rm -f '{}' \; # same thing
  find / -name core -delete                  <nowiki># same if using Gnu find</nowiki></div>
  find / -name core -delete                  <nowiki># same if using Gnu find</nowiki>


The last two forms run the <tt>rm</tt> 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 last two forms run the <tt>rm</tt> command once per file, and are not as efficient as the first form; but they are safer if file names contain spaces or newlines.  
Zeile 1.886: Zeile 1.881:
One of my favorite of the <tt>find</tt> 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:  
One of my favorite of the <tt>find</tt> 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:  


<div style="margin-left:0cm;margin-right:0cm;">find / -mmin -10</div>
find / -mmin -10


This search is also useful when I've downloaded some file but can't locate it, only in that case “<tt>‑cmin</tt>” may work better.  
This search is also useful when I've downloaded some file but can't locate it, only in that case “<tt>‑cmin</tt>” may work better.  
Zeile 1.898: Zeile 1.893:
The following will locate files that are writable by “others” (including symlinks, which should be writable by all):  
The following will locate files that are writable by “others” (including symlinks, which should be writable by all):  


<div style="margin-left:0cm;margin-right:0cm;">find . -perm -o=w</div>
find . -perm -o=w


(Using <tt>‑perm</tt> is more complex than this example shows.  
(Using <tt>‑perm</tt> is more complex than this example shows.  
Zeile 1.912: Zeile 1.907:
This default behavior is useful when using the “<tt>‑prune</tt>” action to prevent <tt>find</tt> from examining any files you want to ignore:  
This default behavior is useful when using the “<tt>‑prune</tt>” action to prevent <tt>find</tt> from examining any files you want to ignore:  


<div style="margin-left:0cm;margin-right:0cm;">find / -name /dev -prune ...''other criteria'' | xargs tar ...</div>
find / -name /dev -prune ...''other criteria'' | xargs tar ...


Using just “<tt>find / ‑name /dev ‑prune | xargs tar ...</tt>” won't work as most people might expect. This says to only find files named “<tt>/dev</tt>”, and then (if a directory) don't descend into it. So you only get the single directory name “<tt>/dev</tt>”! A better plan is to use the following:  
Using just “<tt>find / ‑name /dev ‑prune | xargs tar ...</tt>” won't work as most people might expect. This says to only find files named “<tt>/dev</tt>”, and then (if a directory) don't descend into it. So you only get the single directory name “<tt>/dev</tt>”! A better plan is to use the following:  


<div style="margin-left:0cm;margin-right:0cm;">find / ! -path /dev\* |xargs ...</div>
find / ! -path /dev\* |xargs ...


which says find everything except pathnames that start with “<tt>/dev</tt>”. The “<tt>!</tt>” means Boolean ''NOT''.  
which says find everything except pathnames that start with “<tt>/dev</tt>”. The “<tt>!</tt>” means Boolean ''NOT''.  
Zeile 1.926: Zeile 1.921:
For example:  
For example:  


<div style="margin-left:0cm;margin-right:0cm;">find . -mtime 0  <nowiki># find files modified between now and 1 day ago</nowiki>
find . -mtime 0  <nowiki># find files modified between now and 1 day ago</nowiki>
                   <nowiki># (i.e., within the past 24 hours)</nowiki>
                   <nowiki># (i.e., within the past 24 hours)</nowiki>
  find . -mtime -1  <nowiki># find files modified less than 1 day ago</nowiki>
  find . -mtime -1  <nowiki># find files modified less than 1 day ago</nowiki>
Zeile 1.933: Zeile 1.928:
  find . -mtime +1  <nowiki># find files modified more than 48 hours ago</nowiki>
  find . -mtime +1  <nowiki># find files modified more than 48 hours ago</nowiki>
  find . -mmin +5 -mmin -10 # find files modified between
  find . -mmin +5 -mmin -10 # find files modified between
                           <nowiki># 6 and 9 minutes ago</nowiki></div>
                           <nowiki># 6 and 9 minutes ago</nowiki>


=== {{anchor|RefHeadingToc52274055916525}} Find und Sort ===
=== Find und Sort ===


<div style="margin-left:0cm;margin-right:0cm;">find -type f -print0 | xargs -0 stat -c "%y %n" | sort -r | head -20</div>
find -type f -print0 | xargs -0 stat -c "%y %n" | sort -r | head -20


==== Sort by size ====
==== Sort by size ====


<div style="margin-left:0cm;margin-right:0cm;">find -type f -exec ls -ltu {} \; | sort -k 5 -n</div>
find -type f -exec ls -ltu {} \; | sort -k 5 -n


==== Sort by access time ====
==== Sort by access time ====


<div style="margin-left:0cm;margin-right:0cm;">find -type f -exec ls -ltu {} \; | sort -k 6 -M</div>
find -type f -exec ls -ltu {} \; | sort -k 6 -M


==== Search recursively by date ====
==== Search recursively by date ====


<div style="margin-left:0cm;margin-right:0cm;">find -printf "%TY-%Tm-%Td %TT %p\n" | tail -20 | sort -n</div>
find -printf "%TY-%Tm-%Td %TT %p\n" | tail -20 | sort -n


Have you ever wanted to view a list of all files or subdirectories within a directory in Linux and order them by when they were last changed or modified? Then you have come to the right place! Here we are going to provide and explain some useful commands that when piped together will give us this result, allowing us to recursively list files and directories by date.
Have you ever wanted to view a list of all files or subdirectories within a directory in Linux and order them by when they were last changed or modified? Then you have come to the right place! Here we are going to provide and explain some useful commands that when piped together will give us this result, allowing us to recursively list files and directories by date.
Zeile 1.955: Zeile 1.950:
This is one of my favourite commands to use when trying to build a timeline of events, for instance if a server or website has been compromised and you want to see when files have been modified with malicious content. By seeing other files that were modified around the same time you can get a better idea of what took place and when, allowing you to correlate these events with your logs.
This is one of my favourite commands to use when trying to build a timeline of events, for instance if a server or website has been compromised and you want to see when files have been modified with malicious content. By seeing other files that were modified around the same time you can get a better idea of what took place and when, allowing you to correlate these events with your logs.


===== {{anchor|RefHeadingToc3064060109319}} The Commands =====
===== The Commands =====


So here are the simple commands piped together, run this within a directory and you will be provided with a list of all files and subdirectories along with the date they were last modified. The most recently changed contents will be at the bottom of the list, so after running it you’ll see the most recent changes with the older changes as you scroll up. If you have a lot of output piping the whole lot into ‘less’ may be a good idea so that you can easily scroll through.
So here are the simple commands piped together, run this within a directory and you will be provided with a list of all files and subdirectories along with the date they were last modified. The most recently changed contents will be at the bottom of the list, so after running it you’ll see the most recent changes with the older changes as you scroll up. If you have a lot of output piping the whole lot into ‘less’ may be a good idea so that you can easily scroll through.


find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-
find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-


Below is an example output from running this full command.
Below is an example output from running this full command.


'''<nowiki># find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-</nowiki>'''
'''<nowiki># find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-</nowiki>'''
Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
Sat Sep 12 12:43:48.0166880221 2015 ./directory
Sat Sep 12 12:43:48.0166880221 2015 ./directory
Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
Wed Oct 21 10:50:16.0672628610 2015 ./index.html
Wed Oct 21 10:50:16.0672628610 2015 ./index.html


As shown we can see the files sorted from oldest date and time modified to newest. Now let’s break down what each part is actually doing for us.
As shown we can see the files sorted from oldest date and time modified to newest. Now let’s break down what each part is actually doing for us.


====== {{anchor|RefHeadingToc3084060109319}} [http://linux.die.net/man/1/find Find] ======
====== [http://linux.die.net/man/1/find Find] ======


First off the find command is run which finds us the list of all files and subdirectories recursively within the current working directory, as specified by the “.” after the find command. To confirm your current working directory you can run the “pwd” command. You can change the “.” to a full directory path instead to list all files and subdirectories in there instead if required, this way you don’t have to be in the directory.
First off the find command is run which finds us the list of all files and subdirectories recursively within the current working directory, as specified by the “.” after the find command. To confirm your current working directory you can run the “pwd” command. You can change the “.” to a full directory path instead to list all files and subdirectories in there instead if required, this way you don’t have to be in the directory.
Zeile 1.984: Zeile 1.979:
The output of this find command alone looks like this.
The output of this find command alone looks like this.


1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html


At this stage the output does not display in any sort of chronological order. We can see the output displayed as expected, the files epoch time followed by the last modification date and time, followed by the file name.
At this stage the output does not display in any sort of chronological order. We can see the output displayed as expected, the files epoch time followed by the last modification date and time, followed by the file name.


====== {{anchor|RefHeadingToc3104060109319}} [http://linux.die.net/man/1/sort Sort] ======
====== [http://linux.die.net/man/1/sort Sort] ======


Now with this output you may have noticed that there is no order applied, this is taken care of with the sort command. The -k flag specifies a start position which in this case is 1, the first column being the epoch time.
Now with this output you may have noticed that there is no order applied, this is taken care of with the sort command. The -k flag specifies a start position which in this case is 1, the first column being the epoch time.
Zeile 1.994: Zeile 1.989:
The output with the sort is shown below, now we have the files in the same order as the output of the full command string shown previously after sorting by column 1, the epoch time. As the epoch time is all numbers, we also use -n to perform a numerical based sort.
The output with the sort is shown below, now we have the files in the same order as the output of the full command string shown previously after sorting by column 1, the epoch time. As the epoch time is all numbers, we also use -n to perform a numerical based sort.


1440581104.0000000000 Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
1440581104.0000000000 Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
1441088863.0000000000 Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
1441088863.0000000000 Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
1442061411.0000000000 Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
1442061411.0000000000 Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
1442061828.1668802210 Sat Sep 12 12:43:48.0166880221 2015 ./directory
1442061828.1668802210 Sat Sep 12 12:43:48.0166880221 2015 ./directory
1444627101.0000000000 Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
1444627101.0000000000 Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
1445156986.0000000000 Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
1445156986.0000000000 Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html


We can change -n to -nr which will reverse the output, resulting in the oldest modified files showing at the bottom of the output, rather than the newest.
We can change -n to -nr which will reverse the output, resulting in the oldest modified files showing at the bottom of the output, rather than the newest.


====== {{anchor|RefHeadingToc3124060109319}} [http://linux.die.net/man/1/cut Cut] ======
====== [http://linux.die.net/man/1/cut Cut] ======


Now that we have our sorted output we use the cut command to tidy up and print out a more specific selection. By specifying a delimiter with -d of ‘ ‘ we find the first white space which comes after the epoch time and cut everything afterwards.
Now that we have our sorted output we use the cut command to tidy up and print out a more specific selection. By specifying a delimiter with -d of ‘ ‘ we find the first white space which comes after the epoch time and cut everything afterwards.
Zeile 2.010: Zeile 2.005:
At this point we now have the complete output which lists all files by date recursively from the specified directory. The epoch time provided an easy way to perform the sort, but we don’t really need to see that in the final output as it isn’t particularly human readable so it’s been removed after the sort.
At this point we now have the complete output which lists all files by date recursively from the specified directory. The epoch time provided an easy way to perform the sort, but we don’t really need to see that in the final output as it isn’t particularly human readable so it’s been removed after the sort.


===== {{anchor|RefHeadingToc3144060109319}} Other Options =====
===== Other Options =====


Of course you can always use the much simpler “ls -lrt” within a directory to view all files within the current working directory from oldest to newest, however this does not take into consideration subfolder contents. Even if we use the recursive option and use “ls -lRrt” we only see the files ordered based on the dates within each directory and not a combination of all subdirectories.
Of course you can always use the much simpler “ls -lrt” within a directory to view all files within the current working directory from oldest to newest, however this does not take into consideration subfolder contents. Even if we use the recursive option and use “ls -lRrt” we only see the files ordered based on the dates within each directory and not a combination of all subdirectories.
Zeile 2.016: Zeile 2.011:
If you aren’t interested in the subdirectories themselves you could also add a “-type f” to the find command which will only list files, as shown below.
If you aren’t interested in the subdirectories themselves you could also add a “-type f” to the find command which will only list files, as shown below.


find . '''-type f''' -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-
find . '''-type f''' -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-


This still lists files within subdirectories, it simply no longer also shows the subdirectory names themselves in the output.
This still lists files within subdirectories, it simply no longer also shows the subdirectory names themselves in the output.
Zeile 2.022: Zeile 2.017:
The opposite can also be done, by using “-type d” which will display only directories and no files.
The opposite can also be done, by using “-type d” which will display only directories and no files.


find . '''-type d''' -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-
find . '''-type d''' -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-


===== {{anchor|RefHeadingToc3164060109319}} Summary =====
===== Summary =====


By combining a few relatively simple bash commands in Linux we have been able to successfully list all files and subdirectories within a specified directory recursively by their modification or change date, in either ascending or descending order. We can also optionally specify to only view files or directories in the output.
By combining a few relatively simple bash commands in Linux we have been able to successfully list all files and subdirectories within a specified directory recursively by their modification or change date, in either ascending or descending order. We can also optionally specify to only view files or directories in the output.
Zeile 2.030: Zeile 2.025:
This command is a great way of building a timeline of events as the chronological output allows us to see the order of file modifications, regardless of where the file is actually located.
This command is a great way of building a timeline of events as the chronological output allows us to see the order of file modifications, regardless of where the file is actually located.


===== {{anchor|RefHeadingToc3184060109319}} Quelle =====
===== Quelle =====


* <tt>Posted by [https://www.rootusers.com/author/jarrod/ Jarrod] on November 25, 2015 [https://www.rootusers.com/how-to-search-all-files-by-date-recursively-in-linux/#respond Leave a comment] (1) [https://www.rootusers.com/how-to-search-all-files-by-date-recursively-in-linux/#comments Go to comments]
* <tt>Posted by [https://www.rootusers.com/author/jarrod/ Jarrod] on November 25, 2015 [https://www.rootusers.com/how-to-search-all-files-by-date-recursively-in-linux/#respond Leave a comment] (1) [https://www.rootusers.com/how-to-search-all-files-by-date-recursively-in-linux/#comments Go to comments]
Zeile 2.038: Zeile 2.033:
==== Weitere Lösungen ====
==== Weitere Lösungen ====


<div style="margin-left:0cm;margin-right:0cm;">find -type f -printf '%T@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10</div>
find -type f -printf '%T@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10
<div style="margin-left:0cm;margin-right:0cm;">find -type f -printf '%T@ %p\n' | sort -k1 -n</div>
find -type f -printf '%T@ %p\n' | sort -k1 -n
<div style="margin-left:0cm;margin-right:0cm;">find -type f -print0 | xargs -0 stat -c "%y %n" | sort</div>
find -type f -print0 | xargs -0 stat -c "%y %n" | sort
<div style="margin-left:0cm;margin-right:0cm;">find -type f -print0 | xargs -0 stat -f "%m %Sm %N" | sort -rn</div>
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.
If you have not GNU utilities, you could use newlines as separators instead of nulls, but you'll lose support for filenames containing newlines.


<div style="margin-left:0cm;margin-right:0cm;">find -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //'</div>
find -type f -printf '%T@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //'


=== {{anchor|RefHeadingToc4923640187039}} Compare Filetree ===
=== Compare Filetree ===


<div style="margin-left:0cm;margin-right:0cm;">find directory1 -type d -printf "%P\n" | sort > file1
find directory1 -type d -printf "%P\n" | sort > file1
  find directory2 -type d -printf "%P\n" | sort | diff – file1</div>
  find directory2 -type d -printf "%P\n" | sort | diff – file1


== {{anchor|RefHeading7188315101596}} Typische Probleme ==
== Typische Probleme ==


=== {{anchor|RefHeading4430100347735}} Find ohne Ende ===
=== 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.
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.


=== {{anchor|RefHeading4432100347735}} Pfad muss vor Suchkriterium stehen ===
=== Pfad muss vor Suchkriterium stehen ===


Wenn man den Stern <tt><nowiki>*</nowiki></tt> nicht maskiert kommt es oft zu folgender Meldung:
Wenn man den Stern <tt><nowiki>*</nowiki></tt> nicht maskiert kommt es oft zu folgender Meldung:


<div style="margin-left:0cm;margin-right:0cm;">find /tmp -name *sh
find /tmp -name *sh
  find: Der Pfad muß vor dem Suchkriterium stehen: adhoc.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] </div>
  Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Suchkriterium]  


Mit  
Mit  


<div style="margin-left:0cm;margin-right:0cm;">find /tmp -name "*sh" </div>
find /tmp -name "*sh"  


ist das leicht geheilt.
ist das leicht geheilt.


=== {{anchor|RefHeading4434100347735}} Seltsame Größen ===
=== 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.  
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.  


<div style="margin-left:0cm;margin-right:0cm;">find -size 200c  </div>
find -size 200c   


sucht nach Größen, die man vom Dezimalsystem her erwartet.
sucht nach Größen, die man vom Dezimalsystem her erwartet.


====== {{anchor|RefHeading4436100347735}} Seltsames Nichtfinden bei Größen wie k, M, G ======
====== 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:  
Sucht man nach Dateien, die kleiner sind als 1000k, so werden Dateien bis maximal 999k gefunden:  


<div style="margin-left:0cm;margin-right:0cm;">find -size -1000k  </div>
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).  
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).  
Zeile 2.090: Zeile 2.085:
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.  
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.  


=== {{anchor|RefHeading4438100347735}} Kombination von UND und ODER  ===
=== Kombination von UND und ODER  ===


Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.
Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.


=== {{anchor|RefHeading4440100347735}} Positionssensitiv ===
=== 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.  
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.  
Zeile 2.102: Zeile 2.097:
Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt.  
Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt.  


<div style="margin-left:0cm;margin-right:0cm;">find tmp -name "a" -maxdepth 3 -mindepth 3 </div>
find tmp -name "a" -maxdepth 3 -mindepth 3  
<div style="margin-left:0cm;margin-right:0cm;">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. </div>
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:  
Provozieren kann man die Warnung etwa so:  


<div style="margin-left:0cm;margin-right:0cm;">find ./suchverzeichnis -maxdepth 4 -name foo -or -maxdepth 2 </div>
find ./suchverzeichnis -maxdepth 4 -name foo -or -maxdepth 2  


=== {{anchor|RefHeading4442100347735}} Xargs und Schleifen ===
=== Xargs und Schleifen ===


Oft findet man Konstruktionen mit <tt>find ... xargs</tt> oder Shellschleifen die find bemühen.  
Oft findet man Konstruktionen mit <tt>find ... xargs</tt> oder Shellschleifen die find bemühen.  
Zeile 2.115: Zeile 2.110:
Fast immer lässt sich das Problem durch eine der [http://wiki.ubuntuusers.de/find#Aktionen Aktionen] (-okdir, -execdir, ...) eleganter lösen.
Fast immer lässt sich das Problem durch eine der [http://wiki.ubuntuusers.de/find#Aktionen Aktionen] (-okdir, -execdir, ...) eleganter lösen.


=== {{anchor|RefHeading4444100347735}} Aktion -delete an falscher Stelle ===
=== Aktion -delete an falscher Stelle ===


So löscht z.B. der folgende Aufruf den kompletten Inhalt des Ordners '''/home/otto/''':
So löscht z.B. der folgende Aufruf den kompletten Inhalt des Ordners '''/home/otto/''':


<div style="margin-left:0cm;margin-right:0cm;">find /home/otto/ -delete -name Cache  </div>
find /home/otto/ -delete -name Cache   


=== {{anchor|RefHeading7028739995267}} Common “Gotcha” ===
=== 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:  
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:  


<div style="margin-left:0cm;margin-right:0cm;">find \( ''expression'' \) -print</div>
find \( ''expression'' \) -print


The implied parenthesis can cause unexpected results. For example, consider these two similar commands:  
The implied parenthesis can cause unexpected results. For example, consider these two similar commands:  


<div style="margin-left:0cm;margin-right:0cm;">'''find -name tmp -prune -o -name \*.txt'''
'''find -name tmp -prune -o -name \*.txt'''
./bin/data/secret.txt
  ./bin/data/secret.txt
./tmp
  ./tmp
./missingEOL.txt
  ./missingEOL.txt
./public_html/graphics/README.txt
  ./public_html/graphics/README.txt
./datafile.txt</div>
  ./datafile.txt
<div style="margin-left:0cm;margin-right:0cm;">'''find -name tmp -prune -o -name \*.txt -print'''
'''find -name tmp -prune -o -name \*.txt -print'''
./bin/data/secret.txt
  ./bin/data/secret.txt
./missingEOL.txt
  ./missingEOL.txt
./public_html/graphics/README.txt
  ./public_html/graphics/README.txt
./datafile.txt</div>
  ./datafile.txt


The lack of an action in the first command means it is equivalent to:  
The lack of an action in the first command means it is equivalent to:  


<div style="margin-left:0cm;margin-right:0cm;">find . \( -name tmp -prune -o -name \*.txt \) -print</div>
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.  
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.  
Zeile 2.151: Zeile 2.146:
The <tt>find</tt> command can be amazingly useful.&nbsp; See the man page to learn all the criteria and actions you can use.  
The <tt>find</tt> command can be amazingly useful.&nbsp; See the man page to learn all the criteria and actions you can use.  


=== {{anchor|RefHeading7014539995267}} -regex ===
=== -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.
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.
Zeile 2.157: Zeile 2.152:
Why are these not the same?
Why are these not the same?


<div style="margin-left:0cm;margin-right:0cm;">find -regex '.*[1234567890]'</div>
find -regex '.*[1234567890]'
<div style="margin-left:0cm;margin-right:0cm;"><nowiki>find -regex '.*[[:digit:]]'</nowiki></div>
<nowiki>find -regex '.*[[:digit:]]'</nowiki>


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.
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.
Zeile 2.166: Zeile 2.161:
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:
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:


<div style="margin-left:0cm;margin-right:0cm;">find . -regex "[a-f0-9\-]\{36\}\.jpg".</div>
find . -regex "[a-f0-9\-]\{36\}\.jpg".


But it doesn't work. Something wrong with the regex? Could someone help me with this?
But it doesn't work. Something wrong with the regex? Could someone help me with this?


<div style="margin-left:0cm;margin-right:0cm;">find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"</div>
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.
Note that you need to specify <tt>.*/</tt> in the beginning because <tt>find</tt> matches the whole path.
Zeile 2.176: Zeile 2.171:
==== Beispiel ====
==== Beispiel ====


<div style="margin-left:0cm;margin-right:0cm;">'''$ find . -name "*.jpg"'''
'''$ find . -name "*.jpg"'''
./foo-111.jpg
  ./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
  ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg</div>
  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
<div style="margin-left:0cm;margin-right:0cm;">'''$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"'''
'''$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"'''
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
  ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg</div>
  ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
<div style="margin-left:0cm;margin-right:0cm;">'''$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.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'.</div>
  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'.


[[Category:Entwurf]]
[[Category:Entwurf]]

Version vom 13. Dezember 2021, 13:22 Uhr

V.31 (11.11.2020)

Linux- GNU Find

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 [PFAD...] [AUSDRUCK...]

find ist ein äußerst mächtiges Instrument zum Suchen von Dateien.

Mit PFAD kann dem Kommando ein beliebiges Startverzeichnis für die Suche angegeben werden. 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.

Die gebräuchlichste Methode wird die Suche nach Dateien mit einem bestimmten Namen sein.

Die Option -name Dateiname ermöglicht dies. 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.

find /usr -maxdepth 3 -name "XF*"
 /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, usw. 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 locate.

Implementierungen

Nicht alle Implementierungen von find sind gleich. 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 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.

Im aktuellen Verzeichnis, ohne Unterverzeichnisse

zu berücksichtigen, kommt man mit automatischer Vervollständigung und den Jokerzeichen * und ? oft weiter, wenn man Namensbestandteile kennt.

Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen, siehe ls und Shell/grep.

Grundlegende Verwendung

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

find . -path './.*' -prune -o -print
.
./nsmail
./iglinux.tgz
./linuxbuch 

Suchkriterien

Alle numerischen Argumente können auf drei Arten angegeben werden:


+ 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 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.

-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, Wildcards, wie der * 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. Das * 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 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 <Muster> entspricht. Mit dieser Option wird <Muster> wie ein Suchmuster behandelt (siehe Kapitel 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 Typ

Findet Dateien eines bestimmten Types


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.

-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. <Typ> kann folgende Werte annehmen: f (reguläre Datei), d (Verzeichnis), l (symbolischer Verweis), s (Socket), b (Blockdatei), c (Zeichendatei) oder p (benannte Umleitung).

Datum/Zeit

Zeitstempel von Dateien

Die Zeitstempel der Dateien sind in Linux in den Inodes abgelegt.

Dort stehen jeweils 4 Zeitstempel, wovon jedoch einer für den Anwender nicht sichtbar und auch nicht von Interesse ist, den verwendet Linux im Filesystem zum Verwalten der gelöschten Inode, er enthält die Zeit, zu der die Datei gelöscht worden ist, und somit der Inode für eine neue Verwendung frei geworden ist.

Derzeit kommt im ext3/4 Filesystem noch ein weiterer Zeitstempel hinzu, auf den wohl so mach ein ehemaliger Windowsuser schon lange gewartet hat, und der die wirkliche Entstehungszeit der Datei dokumentiert.

Dazukommen bedeutet, in aktuellen Systemen ist er intern schon da, allerdings war dies das geringste Problem. Das Hauptproblem jetzt, es müssen sehr viele, zum Teil auch zentrale Librarys und Programme, auf eine mögliche Benutzung dieses Zeitstempels noch angepasst werden.

Solche weitreichenden Änderungen könnten nur durch eine gezielte Koordinierung von zahlreichen Projekten schnell eingebracht werden.

Es wird also durchaus noch einiges Wasser die Flüsse herunterfließen, bis Otto der Normalanwender letztlich diesen Zeitstempel irgendwann einmal zu Gesicht bekommt, bzw. bis er wirklich auch damit arbeiten kann.

Access Time (atime)

Diese Zeit wird jedes mal neu gesetzt, wenn der Inhalt der Datei geöffnet worden ist. In ihm wird also der letzte Zugriff auf den Inhalt der Datei angezeigt.

Dabei ist es für diesen Zeitstempel von Bedeutung, ob die Datei vor einem schreiben erst gelesen wird oder nur an das Ende weitergeschrieben wird.

Ansonsten gilt, egal ob die Datei gelesen oder ausgeführt wird oder ob eine Kopie von dieser Datei gemacht wird, oder die Datei durchsucht wird, oder die Datei in ein Backuparchiv aufgenommen wird - immer wird dieser Zeitstempel neu auf die aktuelle Zeit gesetzt.

Durch die Auswertung dieses Zeitstempels könnten wir also z.B. feststellen, das wir eine Datei schon einen längeren Zeitraum nicht mehr angefasst haben.

Das kann unter Anderem dabei helfen alte temporäre User- oder Systemdateien zu löschen.

Das ständige setzen der Access Time von Dateien und Verzeichnissen kann bei sehr vielen Zugriffen in einem Filesystem eine nicht unbedeutende Last verursachen, in bestimmten Situationen ist dieses aus Performancegründen nicht gewünscht, und kann deshalb z.B. mit Mountoptionen des Filesystems für alle Dateien oder alle Verzeichnisse abgeschaltet werden.

Einige Filesysteme erlauben auch ein gezieltes Abschalten dieser ständigen atime Aktualisierungen für ausgewählte Dateien oder Verzeichnisse.

Modify Time (mtime)

Diese Zeit wird gesetzt, wenn der Inhalt der Datei verändert wird. In diesem Zeitstempel steht also die Zeit der letzten Veränderung der Dateidaten.

Es ist der Zeitstempel der für uns die meiste Bedeutung hat. Können wir doch damit feststellen, wie aktuell die Dateidaten sind. Diese Zeit wird z.B. bei ls -l in der default Einstellung angezeigt.

Change Time (ctime)

Fälschlicher Weise wird ctime oftmals mit Create Time übersetzt und somit herrscht über diesen Zeitstempel oftmals eine ganz falsche Vorstellung.

Mit diesem Zeitstempel wird die Zeit gespeichert, zu welcher das letzte Mal die Daten innerhalb des Inodes geändert worden sind.

Wenn man sich anschaut, welche Daten im Inode enthalten sind, kann man schon erahnen, wann diese Zeit neu gesetzt wird.

Bei einem Ändern des Dateiinhaltes werden die Dateigröße sowie die Datenblöcke neu gesetzt, beim Ändern der Zugriffsrechte, der UserID oder GruppenID, beim Anlegen eines neuen Hardlinks immer wird auch der Inhalt des Inodes geändert und damit auch die ctime neu gesetzt.

Aber auch bei einem Umbenennen der Datei, wird die ctime neu gesetzt, (man muss sich dabei vorstellen, das beim Umbenennen die Anzahl der "Links" zuerst um 1 erhöht wird, dann wird der neue Name angelegt, und dann anschließend der alte Name gelöscht und die "Links" wieder um 1 verringert).

Es gibt eine einzige Ausnahme bei der die ctime nicht gesetzt wird: wenn durch das Auslesen der Datei nur die Access Time im Inode neu gesetzt wird, also die Datei z.B. ausgelesen wird, dann wird die Change Time nicht neu gesetzt.

Dieser Zeitstempel hat z.B. eine große Bedeutung fürs Backup, da damit nicht nur festgestellt werden kann, ob sich der Inhalt der Datei sondern z.B. auch der Name oder die Eigentums- oder Zugriffsrechte einer Datei seit dem letzten Backup geändert haben.

Während sich die anderen beiden Zeitstempel durch Befehle auf eine bestimmte Zeit manipulieren lassen, ist es nicht möglich die ctime auf diese Art zu setzen.

What if you want to find files by their age? This is something that can be useful if you're trying to find a file that you know you created within a certain timeframe, or if you want to look for older files to delete. Lots of good reasons, actually.

The find utility is all about finding by time. You can search by access time (-atime) or the last time a file was modified (-mtime) or by the last time it was changed (-ctime).

For example, let's look for any files that have not been modified in the last two days:

find -mtime +2

The options take a number that is interpreted as "n times 24 hours ago" and actually encompass a range. If you say +1, find will interpret that as "at least 24 hours ago, but not more than 48 hours ago."

You can combine the options, if you want to look for files within a specific range. So find -mtime +2 -mtime -5 would be "two or more days ago, but not more than five days ago."

Unterschiede bei Dateitypen

Bei der Interpretation der Zeitstempel müssen wir weiterhin unterscheiden, ob es sich um eine "normale" Datei oder z.B. um ein Verzeichnis handelt.

Die Funktion der Zeitstempel ist bei allen Dateitypen prinzipiell gleich, allerdings durch den speziellen Aufbau und die Funktion einzelner Dateitypen ergibt sich eine etwas andere Betrachtungsweise.

Bei den Verzeichnissen bedeutet die atime, das Verzeichnis wurde gelesen z.B. mit ls, die mtime bedeutet es wurde in diesem Verzeichnis an den Namen der Dateien etwas geändert, oder Dateien sind in diesem Verzeichnis dazu gekommen oder entfernt worden.

Pipes und Geräteknoten zeigen prinzipiell analoges Verhalten wie normale Dateien, es gibt jedoch einige Besonderheiten bei Symbolischen Links.

Die atime wird hier immer dann gesetzt, wenn über diesen Weg auf die verlinkte Datei zugegriffen wird. Die ctime wird gesetzt bei Eigentumswechsel oder Umbenennen der Datei.

Da der eigentliche Inhalt des Softlinks, der Verweis auf die Datei nicht geändert werden kann, wird die mtime nur bei der Erstellung des Softlinks gesetzt.

Beim Versuch mittels chmod oder touch auf den Inode des Softlinks zuzugreifen, wird statt dessen dem Link gefolgt und der Zugriff erfolgt dort auf den Inode der verlinkten Datei.

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, bzw. mindestens <n> 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 <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, 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 - 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, 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 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 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 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.


( 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 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 -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, d.h. 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, 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 ‑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!

(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

I like the explicit shell being defined... – djangofan 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, 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 -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 ;, 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 -delete.

-okdir Kommando {} +

Wie eine Kombination von -ok und -execdir, d.h. 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.

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:

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.

Suche optimieren: xargs

Sollen viele Dateien bearbeiten werden wird für jede Datei ein eigene Befehl abgesetzt. Findet find(1) nun 2000 Dateien des Users toelpel, werden (hintereinander) 2000 Prozesse gestartet, die jeweils eine Datei löschen.

Das verlangsamt den Vorgang und erzeugt unnötig Last. rm(1) kann mehrere Dateien auf einmal löschen, ein einzelnes rm(1)-Kommando mit 2000 Argumenten wäre sinnvoller.

xargs erwartet als Parameter ein Kommando, welches dann auf Dateien einer Liste angewandt wird, die von der Standardeingabe gelesen werden.

Unter Linux/UNIX kann man fast alle Befehle auf einzelne Datei oder auch auf eine ganze Liste von Dateien anwenden.

Wenn dies nicht möglich sein sollte oder sich eine Dateiliste nicht mit Wildcards erstellen lässt, kann man das Kommando xargs verwenden.

Wenn viele Dateien (manchmal über den Verzeichnisbaum verteilt) gleichartig behandeln werden sollen, ob die Dateien nun gelöscht, der Eigentümer oder die Zugriffsrechte geändert werden soll, ist find(1) eine gute lösung.

find / -user toelpel -exec rm  \{\} \;

Syntax

xargs wird mit folgender Syntax in einem Terminal aufgerufen.

Kommando1 | xargs [Optionen] Kommando2 

Hierbei wird das "Kommando2" mit den Argumenten aufgerufen, die das "Kommando1" auf die Standardausgabe gibt.

xargs(1) hat die Funktion Kommandozeilen aus Standard-Input zu erstellen und auszuführen.

find / -user toelpel -print | xargs rm

find(1) listet alle Dateien des Users toelpel auf und reicht sie über die Pipe an xargs weiter. xargs(1) nimmt die Liste von der Standardeingabe und bastelt daraus und aus dem rm(1), was ihm als Argument übergeben wurde, ein rm(1)-Kommando mit 2000 Argumenten.

Ergebnis: 3 Prozesse anstelle von 2001 Prozessen in der ersten Variante, um 2000 Dateien zu löschen.

Dateinamen mit Leerzeichen

Üblicher Weise enthält der IFS das Leerzeichen, daher bricht xargs die Dateinamen dort auseinander.

Dem ist abzuhelfen, wenn man die GNU-Version der benutzten Tools (find und xargs) verwendet. find(1) gibt man bekannt, er möge mit ASCII-NUL beendete Zeichenketten ausgeben, und xargs, er möge solche erwarten:

find / -user toelpel -print0 | xargs -0 rm

Eingabedatei als Parameter

Sollen die Dateien verschoben werden, erwartet mv die Quelldateien als erstes, das Zielverzeichnis als letztes Argument. Dieses Problem löst man bei xargs(1) genauso wie bei find(1):

find / -user toelpel -print0 | xargs -0 mv {} /tmp/toelpel-trash

Die Zeichenkombination "{}" zeigt dem xargs(1), an welcher Stelle er die Argumentliste für das Kommando einzufügen hat.

Optionen

-a [Datei] oder --arg-file=[Datei] Liest die Argumente aus einer Datei anstatt von der Standardeingabe
-0 oder --null Argumente werden aufgrund des NULL-Zeichens getrennt anstatt des Leerzeichen. Jedes Zeichen wird wörtlich genommen. Nützlich in Kombination mit der -print0 Option von find.
-d [Trennzeichen] oder --delimiter=[Trennzeichen] Argumente werden aufgrund des Trennzeichens getrennt anstatt des Leerzeichens. Jedes Zeichen wird wörtlich genommen. Das Trennzeichen kann ein einzelnes Zeichen sein, ein escaptes Zeichen, ein oktaler oder ein hexadezimaler Code. Mehrere Zeichen sind nicht erlaubt.
--help Hilfe anzeigen.
-i Standardmäßig wird "{}" als Ersatz-Zeichenkette verwendet, wie bei der Aktion -exec des Befehls find. xargs fügt dann die Dateiliste an der Stelle ein, wo die Ersatz-Zeichenkette steht. Dies kommt zur Anwendung wenn der Befehl die von xargs erzeugte Dateiliste nicht am Ende erwartet.
-p oder --interactive Fragt vor jeder Ausführung, ob fortgefahren werden soll.
-r oder --no-run-if-empty Führt "Kommando2" nicht aus, wenn die Standardeingabe keine Nicht-Leerzeichen enthält.
-n oder --max-args Führt "Kommando2" auf jeweils eine bestimmt Anzahl von übergebenen Argumenten aus.
-P oder --max-procs Führt "Kommando2" mehrfach aus. Mit der Kombination mit -n kann so eine bessere Auslastung des Systems erreicht werden.
-t oder --verbose Gibt mehr Informationen darüber, was gemacht wird.


Beispiele

find /tmp -name core -type f -print | xargs /bin/rm -f

Finde Dateien mit dem Namen core in oder unterhalb des Verzeichnisses /tmp und lösche diese.

Achtung, diese Aktion schlägt fehl falls die Dateinamen Zeilenvorschübe, einfache oder doppelte Anführungszeichen oder Leerzeichen enthalten.

Mit folgendem Befehl werden alle Dateien aus dem aktuellen Verzeichnis entfernt, die auf das Muster *.tmp passen.

Dabei werden Dateien, deren Namen Leerzeichen enthalten ebenfalls berücksichtigt:

find . -name "*.tmp" -print0 | xargs -0 rm 

Als nächstes eine Anwendung mit der Ersatz-Zeichenkette {}. Alle Dateien des Benutzers mit der uid 1001 werden nach /tmp/klaus/test verschoben.

Achtung!

Die Verzeichnisstruktur wird dabei nicht wieder hergestellt. Die Dateien landen wirklich alle in /tmp/klaus/test.

find . -uid 1001 -print | xargs -i mv {} /tmp/klaus/test 

Wenn man eine Datei software.list mit den Namen von Paketen hat, die sich im Verzeichnis ~/installation/ befindet und die wie folgt aufgebaut ist

alltray
 audacity
 avidemux
 azureus
 compizconfig-settings-manager

kann man mit

xargs -a ~/installation/software.list sudo apt-get install 

die Pakete komfortabel alle auf einmal installieren. Dabei werden bereits installierte Pakete übersprungen.

Möchte man mehrere Dateien herunterladen, aber die Geschwindigkeit der Server lastet die eigene Internetverbindung nicht aus, so kann man mit xargs einfach mehrere Instanzen benutzen.

xargs -a downloadlist -n 1 -P 4 wget 

Dieser Befehl übergibt jeweils eine URL aus der Datei downloadlist an wget.

Dabei wird wget vier mal jeweils mit einer anderen Datei gestartet.

So werden vier Dateien auf einmal heruntergeladen und die Internetverbindung optimal ausgenutzt.

Weitere Möglichkeiten

This command is equivalent to using find with xargs, only a bit shorter and more efficient.

But this form of ‑exec can be combined with a shell feature to solve the other problem (names with spaces). The POSIX shell allows us to use:

sh -c command-line [ command-name [ args... ] ]

We don't usually care about the command-name, so “X”, “dummy”, “”, or “'inline cmd'” is often used.

Here's an example of efficiently copying found files to /tmp, in a POSIX-compliant way.

find . -name '*.txt' -type f \
   -exec sh -c 'exec cp -f "$@" /tmp' X '{}' +

Obvious, simple, and readable, isn't it?  Perhaps not, but worth knowing since it is safe, portable, and efficient.

Anwendungen

Beispiel 1

Wo in meinem Homeordner liegt die Datei "test.pdf"?

find ~ -name test.pdf

Ihr habt vor ein paar Minuten eilig etwas gespeichert, habt aber den Namen der Datei und den Pfad sofort vergessen.

Irgendwo in eurem Homeordner, irgendein Name, vor ein paar Minuten...

find ~ -type f ! -path '*/.*' -mmin -10 -ls

Die Optionen im Einzelnen:* ~ -- rekursiv in meinem Homeordner

  • -type f -- eine Datei (kein Ordner...)
  • ! -path '*/.*' -- ohne Dateien oder Ordner, die mit Punkt beginnen.
  • -mmin -10 -- nicht älter als 10 Minuten
  • -ls -- lange Anzeige (wie ls -l)



Variante: mit Dotfiles, nicht aber Ordner, die mit Punkt beginnen (also ohne .gnome/ oder .kde/ usw., aber mit .bash_history). Und zwar alle Dateien, die nicht älter als zwei Tage sind.

find ~ ! -path '*/.*/*' -type f -ctime -2

Im Homeordner alle Dateien finden, deren Namen Leerzeichen enthalten.

Wieder ohne Dateien oder Ordner, die mit Punkt beginnen.

find $HOME ! -path '*/.*' -type f -name '* *'* $HOME -- ist gleichbedeutend mit ~
* -name '* *' -- Name enthält mindestens ein Leerzeichen


Ganz ähnlich, aber diesmal wird nach Ordnern gesucht:

find $HOME ! -path '*/.*' -type d -name '* *'
-type d -- Ordner (type directory)

Im Ordner public_html alle HTML und PHP Dateien ausfindig machen, in denen ".mp3" erwähnt wird.

Nur die Dateinamen ausgeben.

find ~/public_html \( -name \*.html -o -name \*.php \) | xargs grep -l '.mp3'

Zu beachten: ( ) * müssen vor der Bash versteckt, also mit Backslash escaped werden.

Andere Methode (-exec statt xargs), gleiches Ergebnis.

find ~/public_html \( -name \*.html -o -name \*.php \) -exec grep -l '.mp3' '{}' \+

Zu beachten: -exec mit \+ abschließen statt mit \; beschleunigt das Abarbeiten ungemein, weil dann mehrere grep Prozesse parallell gestartet werden (vgl. xargs). Setzt eine halbwegs aktuelle Version von find voraus.

Hoppla, da sind auch Dateien mit Leerzeichen im Namen dabei? Kein Problem.

find ~/public_html \( -name \*.html -o -name \*.php \) -print0 | xargs -0 grep -l '.mp3'

finds Option -print0 erzeugt die richtige Ausgabe für xargs Option -0

Anderer Einsatzzweck: Plattenplatz wird knapp, wo sind die großen Dateien?

Also z.B.: in meinem Homeordner alle Dateien, die größer als 500MB sind.

find ~ -size +500M

Alle Dateien/Ordner in meinem Homeordner finden, die nicht mir gehören:

find ~ ! -user $( whoami ) -ls

Alle Dateien/Ordner in meinem Homeordner, die root gehören:

find ~ -user root

Alle Dateien/Ordner in meinem Homeordner, die die Rechte auf 777 gesetzt haben,

also Lese/Schreib/Ausführrechte für alle haben, lange Ausgabe wie "ls -l".

find ~ -perm 777 -ls

Welche Art von Dateien (Mimetype) liegen im Ordner Documents, mit Rücksicht auf Dateien mit Leerzeichen im Namen, nur in diesem Ordner, keine Unterordner:

find ~/Documents/ -maxdepth 1 -type f -print0 | xargs -0 file

Find sucht immer rekursiv, es sei denn, man schränkt mit "-maxdepth" die Tiefe ein. Die Liste ließe sich beliebig fortsetzen. Wie vielseitig find ist, zeigt sich schon an der Länge der manpage.

Find findet nach Name, Regex, Größe, Datum, Dateityp,... usw. und läßt sich mit "-exec" und der Pipe für "xargs" zu beinahe allem verwenden, was nur auf bestimmte Dateien/Ordner angewendet werden soll. Darum wird das Kommando in vielen Shellskripten verwendet.

Beispiel 2

Dateien im aktuellen Ordner und Unterordnern finden, deren Namen einem bestimmen Muster entsprechen:

find . -name "*.jpg"

Dateien finden, deren Namen nicht einem bestimmten Muster entsprechen:

find . \! -name "*.jpg"

Dateien finden, deren Namen einem bestimmten Muster entsprechen und die einen bestimmten Text enthalten:

find . -name "*.php" -exec grep -il "suchtext" {} \;

Dateien finden, die bestimmte Datei-Endungen haben (Mit Regular-Expressions finden):

find . -regex ".*(php|html|tpl)$"

Große Dateien finden (Dateien finden, die größer als ca. 500 MB sind):

find . -type f -size +500000k -exec ls -lh {} \;

Dateien finden, deren Pfade einem bestimmten Pattern entsprechen:

find . -path "*/.svn*"

Dateien finden, deren Pfade nicht einem bestimmten Pattern entsprechen:

find . \! -path "*/.svn*"

Dateien finden, die nicht einem bestimmten User (nicht root) gehören:

find . \! -user root

Dateien finden, die “oo” oder “ee” im Namen haben:

find . \( -name "*oo*" -or -name "*ee*" \)

Dateien finden, die nicht “oo” oder “ee” im Namen haben:

find . \! \( -name "*oo*" -or -name "*ee*" \)

Geht nicht mit find (GNU findutils) 4.4.2:

find . -regex “.*(php|html|tpl)$”
 mkdir /tmp/tst
 cd /tmp/tst
 mkdir -p 1/2/3
 mkdir -p 4/5/6
 touch la.php
 touch 1/2/uu.tpl
 touch 4/lala.html
 touch 4/5/6/eee.php
 touch 4/5/oooooo'
 find . -regex “.*(php|html|tpl)$”

es wird nix ausgegeben :(

Beispiel 3

Angenommen, Sie möchten eine Liste der Verzeichnisse in /usr/share erhalten, dann tippen Sie:

find /usr/share -type d

Angenommen, Sie haben einen HTTP-Server und alle Ihre HTML-Dateien befinden sich in /home/httpd/html, wo Sie sich auch gerade befinden. Sie möchten eine Liste aller Dateien, deren Inhalt seit einem Monat nicht verändert worden ist.

Da die Seiten von verschiedenen Schreibern stammen, enden einige auf html und einige auf htm. Sie möchten diese Dateien in das Verzeichnis /home/httpd/obsolete verknüpfen.

Geben Sie folgendes ein:[

Denken Sie daran, dass in diesem Beispiel beide Verzeichnisse auf dem selben Dateisystem sein müssen!]

find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 -exec 
 ln {} /home/httpd/obsolete \;

Gut, das hier ist etwas komplex und verlangt nach Erklärung. Das Suchkriterium ist Folgendes:

\( -name "*.htm" -o -name "*.html" \) -a -ctime -30

Es findet alle Dateien, die entweder auf .htm oder auf .html enden (( -name "*.htm" -o -name "*.html" )) und (-a) die in den letzten 30 Tagen nicht modifiziert wurden (-ctime -30). Beachten Sie die Klammern, die hier notwendig sind, da -a eine höhere Wertigkeit hat.

Ließen Sie sie weg, würde das Kommando alle Dateien mit der Endung .htm finden sowie die Dateien, die auf .html enden und seit einem Monat nicht modifiziert wurden.

Beachten Sie auch, dass die Klammern vor der Shell geschützt wurden. Gäben Sie ( .. ) anstelle von \( .. \) ein, würde die Shell versuchen, diese zu interpretieren und das Kommando -name "*.htm" -o -name "*.html" in einer Sub-Shell auszuführen.

Sie können diesen Schutz übrigens auch durch Anführungszeichen erreichen.

Und schließlich das Kommando, das für jede gefundene Datei ausgeführt wird:

-exec ln {} /home/httpd/obsolete \;

Auch hier müssen Sie das ; vor der Shell schützen, da diese es sonst als Kommandoseparator interpretiert und find sich beschweren wird, dass -exec ein Argument fehlt.

Ein letztes Beispiel:

Sie haben ein großes Verzeichnis mit allen möglichen Bilddateien: /shared/images.

Normalerweise benutzen Sie touch, um den Zeitstempel einer Datei namens stamp in diesem Verzeichnis aufzufrischen, um eine Zeitreferenz zu haben.

Sie wollen eine Liste aller JPEG-Dateien, die jünger als die Datei stamp sind.

Da Sie die Dateien von verschiedenen Quellen haben, haben Sie die Endungen jpg, jpeg, JPG oder JPEG. Sie möchten nicht im Verzeichnis old suchen, Sie möchten diese Liste zugeschickt bekommen und Ihr Benutzername ist john:

find /shared/images -cnewer     \
      /shared/images/stamp       \
      -a -iregex ".*\.jpe?g"     \
      -a -not -regex ".*/old/.*" \
        | mail john -s "Neue Images"

Nun wäre es nicht sehr schön, dieses Kommando regelmäßig neu eingeben zu müssen, also brauchen Sie…?

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 (“;”).

(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

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
                  # (i.e., within the past 24 hours)
find . -mtime -1  # find files modified less than 1 day ago
                  # (i.e., within the past 24 hours, as before)
find . -mtime 1   # find files modified between 24 and 48 hours ago
find . -mtime +1  # find files modified more than 48 hours ago
find . -mmin +5 -mmin -10 # find files modified between
                          # 6 and 9 minutes ago

Find und Sort

find -type f -print0 | xargs -0 stat -c "%y %n" | sort -r | head -20

Sort by size

find -type f -exec ls -ltu {} \; | sort -k 5 -n

Sort by access time

find -type f -exec ls -ltu {} \; | sort -k 6 -M

Search recursively by date

find -printf "%TY-%Tm-%Td %TT %p\n" | tail -20 | sort -n

Have you ever wanted to view a list of all files or subdirectories within a directory in Linux and order them by when they were last changed or modified? Then you have come to the right place! Here we are going to provide and explain some useful commands that when piped together will give us this result, allowing us to recursively list files and directories by date.

This is one of my favourite commands to use when trying to build a timeline of events, for instance if a server or website has been compromised and you want to see when files have been modified with malicious content. By seeing other files that were modified around the same time you can get a better idea of what took place and when, allowing you to correlate these events with your logs.

The Commands

So here are the simple commands piped together, run this within a directory and you will be provided with a list of all files and subdirectories along with the date they were last modified. The most recently changed contents will be at the bottom of the list, so after running it you’ll see the most recent changes with the older changes as you scroll up. If you have a lot of output piping the whole lot into ‘less’ may be a good idea so that you can easily scroll through.

find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-

Below is an example output from running this full command.

# find . -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d' ' -f2-
Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
Sat Sep 12 12:43:48.0166880221 2015 ./directory
Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
Wed Oct 21 10:50:16.0672628610 2015 ./index.html

As shown we can see the files sorted from oldest date and time modified to newest. Now let’s break down what each part is actually doing for us.

Find

First off the find command is run which finds us the list of all files and subdirectories recursively within the current working directory, as specified by the “.” after the find command. To confirm your current working directory you can run the “pwd” command. You can change the “.” to a full directory path instead to list all files and subdirectories in there instead if required, this way you don’t have to be in the directory.

The “-printf” flag is used to print the output in the format specified, in this case this is ‘%T@ %t %p\n’. The %T@ displays the epoch time, that is the amount of seconds since the 1st of January 1970, the %t shows the files last modification time, the %p displays the files name while \n is simply a new line so that each result in our output shows up on a new line which makes it easier to read and work with.

It is worth noting that you could also replace %t with %c, which will instead use the files last status change time rather than the modification time. This should show things such as permission changes which don’t actually modify the contents file but change the metadata.

The output of this find command alone looks like this.

1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html

At this stage the output does not display in any sort of chronological order. We can see the output displayed as expected, the files epoch time followed by the last modification date and time, followed by the file name.

Sort

Now with this output you may have noticed that there is no order applied, this is taken care of with the sort command. The -k flag specifies a start position which in this case is 1, the first column being the epoch time.

The output with the sort is shown below, now we have the files in the same order as the output of the full command string shown previously after sorting by column 1, the epoch time. As the epoch time is all numbers, we also use -n to perform a numerical based sort.

1440581104.0000000000 Wed Aug 26 09:25:04.0000000000 2015 ./images/1.jpg
1441088863.0000000000 Tue Sep  1 06:27:43.0000000000 2015 ./1.JPG
1442061411.0000000000 Sat Sep 12 12:36:51.0000000000 2015 ./directory/6.jpg
1442061828.1668802210 Sat Sep 12 12:43:48.0166880221 2015 ./directory
1444627101.0000000000 Mon Oct 12 05:18:21.0000000000 2015 ./images/7.jpg
1445156986.0000000000 Sun Oct 18 08:29:46.0000000000 2015 ./8.jpg
1445424616.6726286100 Wed Oct 21 10:50:16.0672628610 2015 ./index.html

We can change -n to -nr which will reverse the output, resulting in the oldest modified files showing at the bottom of the output, rather than the newest.

Cut

Now that we have our sorted output we use the cut command to tidy up and print out a more specific selection. By specifying a delimiter with -d of ‘ ‘ we find the first white space which comes after the epoch time and cut everything afterwards.

At this point we now have the complete output which lists all files by date recursively from the specified directory. The epoch time provided an easy way to perform the sort, but we don’t really need to see that in the final output as it isn’t particularly human readable so it’s been removed after the sort.

Other Options

Of course you can always use the much simpler “ls -lrt” within a directory to view all files within the current working directory from oldest to newest, however this does not take into consideration subfolder contents. Even if we use the recursive option and use “ls -lRrt” we only see the files ordered based on the dates within each directory and not a combination of all subdirectories.

If you aren’t interested in the subdirectories themselves you could also add a “-type f” to the find command which will only list files, as shown below.

find . -type f -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-

This still lists files within subdirectories, it simply no longer also shows the subdirectory names themselves in the output.

The opposite can also be done, by using “-type d” which will display only directories and no files.

find . -type d -printf '%T@ %t %p\n' | sort -k 1 -n | cut -d ' ' -f2-
Summary

By combining a few relatively simple bash commands in Linux we have been able to successfully list all files and subdirectories within a specified directory recursively by their modification or change date, in either ascending or descending order. We can also optionally specify to only view files or directories in the output.

This command is a great way of building a timeline of events as the chronological output allows us to see the order of file modifications, regardless of where the file is actually located.

Quelle


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

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

I'm having trouble using the regex of the find 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. [[:digit:]]) are not supported in the default regular expression syntax used by find. 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 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

$ 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'.