Linux Systeme

Der Befehl "find"

Beschreibung

Der Befehl find wird dafür verwendet, Dateien und/oder Verzeichnisse zu "finden".

Dabei können dem Befehl durch Optionen die unterschiedlichsten Suchkriterien übergeben werden. Beispielsweise kann man das Suchergebnis aufgrund der Dateigröße, der Art (Datei, Verzeichnis), dem Bearbeitungsdatum und vielem mehr beschränken.

Allgemeine Syntax
Befehl STARTVERZEICHNIS [SUCHKRITERIEN] [AKTIONEN]
find find durchsucht "ab" diesem Verzeichnis alle Unterverzeichnisse (sofern nicht eingeschränkt). ohne Kriterium wird jedes Verzeichnis und jede Datei an die Aktion übergeben.
Ist ein Suchkriterium definiert wird das Objekt nur dann an die Aktion weitergeleitet wenn es die Bedingung erfüllt.
Angabe darüber was mit dem Objekt geschehen soll wenn das Suchkriterium zugetroffen hat.
Beispiele
find
findet ab dem aktuellen Arbeitsverzeichnis alle Dateien und alle Verzeichnisse in allen Unterverzeichnissen.
STARTVERZEICHNIS wird automatisch zum aktuellen Verzeichnis ( . ) - ACHTUNG! Funktioniert nur bei aktuellen Versionen
SUCHKRITERIUM ist immer true/wahr
AKTION wird automatisch zu -print also Ausgabe auf den Bildschirm
find ~/Downloads -name "*.zip"
Findet im Downloads Verzeichnis alle ZIP-Dateien und gibt diese auf den Bildschirm aus
find ~/Downloads -name "*.zip" -size +10M
Findet im Downloads Verzeichnis alle ZIP-Dateien die größer als 10MB sind und gibt diese auf den Bildschirm aus
find ~/Downloads -name "*.zip" -size +10M -delete
Findet im Downloads Verzeichnis alle ZIP-Dateien die größer als 10MB sind und löscht diese
find ~/Downloads -name "*.zip" -size +10M -print -delete
Findet im Downloads Verzeichnis alle ZIP-Dateien die größer als 10MB sind, gibt sie auf den Bildschirm aus und löscht sie anschließend.
find . -ls
Zeigt alle gefundenen Dateien und Verzeichnisse in einer ähnlichen Darstellung an wie der Befehl ls -l
Formatierung der Ausgabe mit der Aktion -printf
find . -printf FORMATSTRING
Mit der Aktion -printf kann gezielt gesteuert werden, wie die Ausgabe der gefunden Objekte auszusehen hat.
Dies erfolgt durch die Übergabe eines so genannten Format-Strings. Also eine Zeichenkette welche als Vorlage für die Ausgabe dient.
Im Formatstring können beliebige Texte ebenso enthalten sein, wie "Platzhalter" für Attribute der gefundenen Objekte.

Einige oft verwendete Platzhalter:
\n
Zeilenumbruch
\t
Tabulator
%p
Der vollständige Pfad
%f
Der Basename - also der Dateiname einer Datei oder der Verzeichnisname bei einem Verzeichnis
%h
Das Verzeichnis in dem sich das Objekt befindet
%k
Die Dateigröße in Kilobyte
%t
Das Änderungsdatum im ctime Format (Standardformat einer C-Funktion). Beispielsweise: Thu Sep 21 14:15:20.1300404960 2023
%T?
Ein Teil des Änderungsdatums wie Stunde, Minute, Tag usw.
Das ? steht für den einzusetzenden Wert lt. Manual Page (man find)
%Td
Zweistelliger Tag des Monats (z.B. 03 für den 3. des Monats)
%Tm
Zweistellige Angabe des Monats (z.B. 09 für September)
%TY
Vierstellige Angabe des Jahres (z.B. 2023)
%TH
Zweistellige Angabe der Stunde im 24-Stunden Format (z.B. 18)
%TM
Zweistellige Angabe der Minute (z.B. 07)
find . -size +100k -printf "%f\t%k\n"
Alle Dateien über 100KB. Ausgegeben wird der Basename und die Größe in KB Tabulatorgetrennt.
zaunerj@linux01:~/example-data$ find . -size +100k -printf "%f\t%k\n"
sample_960x540.mp4      1292
bug-fixing-ways.jpg     132
384-5184x3456.jpg       3280
1054-3079x1733.jpg      832
366-4000x3000.jpg       664
718-2274x1440.webp      228
1038-3914x5863.jpg      3264
1039-6945x4635.jpg      4432
423-5184x3456.jpg       1864
find . -size +100k -printf "%f\t%k\t%h\n"
Beispiel von oben um die Ausgabe des Verzeichnisses erweitert
zaunerj@linux01:~/example-data$ find . -size +100k -printf "%f\t%k\t%h\n"
sample_960x540.mp4      1292    ./media/videos
bug-fixing-ways.jpg     132     ./media/bilder
384-5184x3456.jpg       3280    ./media/picsum-photos
1054-3079x1733.jpg      832     ./media/picsum-photos
366-4000x3000.jpg       664     ./media/picsum-photos
718-2274x1440.webp      228     ./media/picsum-photos
1038-3914x5863.jpg      3264    ./media/picsum-photos
1039-6945x4635.jpg      4432    ./media/picsum-photos
423-5184x3456.jpg       1864    ./media/picsum-photos
find . -size +100k -printf "%u\t%f\t%k\t%h\n"
Beispiel von oben um die Ausgabe des Besitzers am Beginn erweitert.
zaunerj@linux01:~/example-data$ find . -size +100k -printf "%u\t%f\t%k\t%h\n"
zaunerj sample_960x540.mp4      1292    ./media/videos
zaunerj bug-fixing-ways.jpg     132     ./media/bilder
zaunerj 384-5184x3456.jpg       3280    ./media/picsum-photos
zaunerj 1054-3079x1733.jpg      832     ./media/picsum-photos
zaunerj 366-4000x3000.jpg       664     ./media/picsum-photos
zaunerj 718-2274x1440.webp      228     ./media/picsum-photos
zaunerj 1038-3914x5863.jpg      3264    ./media/picsum-photos
zaunerj 1039-6945x4635.jpg      4432    ./media/picsum-photos
zaunerj 423-5184x3456.jpg       1864    ./media/picsum-photos
find . -size +100k -printf "user: %u\t%f\t%k\t%h\n"
Beispiel von oben um die Ausgabe eines normalen Textes (user:) erweitert.
zaunerj@linux01:~/example-data$ find . -size +100k -printf "user: %u\t%f\t%k\t%h\n"
user: zaunerj   sample_960x540.mp4      1292    ./media/videos
user: zaunerj   bug-fixing-ways.jpg     132     ./media/bilder
user: zaunerj   384-5184x3456.jpg       3280    ./media/picsum-photos
user: zaunerj   1054-3079x1733.jpg      832     ./media/picsum-photos
user: zaunerj   366-4000x3000.jpg       664     ./media/picsum-photos
user: zaunerj   718-2274x1440.webp      228     ./media/picsum-photos
user: zaunerj   1038-3914x5863.jpg      3264    ./media/picsum-photos
user: zaunerj   1039-6945x4635.jpg      4432    ./media/picsum-photos
user: zaunerj   423-5184x3456.jpg       1864    ./media/picsum-photos
find . -size +100k -printf "Dateiname: [%f]\tUser: %u\tGröße: %kKB\n"
Folgende Aufgabenstellung wurde angenommen: der Chef-Admin möchte eine "schöne" Liste aller Dateien im example-data Verzeichnis die größer als 100KB sind. Er möchte die Dateigröße, den Dateinamen und den Besitzer sehen.
zaunerj@linux01:~/example-data$ find . -size +100k -printf "Dateiname: [%f]\tUser: %u\tGröße: %kKB\n"
Dateiname: [sample_960x540.mp4] User: zaunerj   Größe: 1292KB
Dateiname: [bug-fixing-ways.jpg]        User: zaunerj   Größe: 132KB
Dateiname: [384-5184x3456.jpg]  User: zaunerj   Größe: 3280KB
Dateiname: [1054-3079x1733.jpg] User: zaunerj   Größe: 832KB
Dateiname: [366-4000x3000.jpg]  User: zaunerj   Größe: 664KB
Dateiname: [718-2274x1440.webp] User: zaunerj   Größe: 228KB
Dateiname: [1038-3914x5863.jpg] User: zaunerj   Größe: 3264KB
Dateiname: [1039-6945x4635.jpg] User: zaunerj   Größe: 4432KB
Dateiname: [423-5184x3456.jpg]  User: zaunerj   Größe: 1864KB

Passen Sie den Befehl so an, dass eine schöne Liste entsteht. Es sollte also der Dateiname als letztes stehen.
find . -name "*.jpg" -printf "%Td.%Tm.%TY %TH:%TM\t%f\n"
Ziel ist eine Liste mit gut lesbarem Modifikationsdatum und dem Dateinamen
find . -name "*.jpg" -printf "%Td.%Tm.%TY %TH:%TM\t%f\n"
17.03.2021 09:16        error404.jpg
17.03.2021 09:16        hose.jpg
17.03.2021 09:16        bug-fixing-ways.jpg
17.03.2021 09:16        linuxwars.jpg
17.03.2021 09:16        dev-vs-dr.jpg
17.03.2021 09:16        it-works.jpg
01.06.2021 07:23        384-5184x3456.jpg
01.06.2021 07:23        1054-3079x1733.jpg
01.06.2021 07:23        366-4000x3000.jpg
  1. Finden Sie alle Dateien und Verzeichnisse ausgehend vom Verzeichnis /usr/share/doc welche den Text "linux" im Namen haben. Dieser Name kann beliebig groß oder klein geschrieben werden.
  2. Erweitern Sie den Befehl aus dem vorigen Beispiel um nur die Verzeichnisse zu berücksichtigen.
  3. Die Option -atime N filtert das Ergebnis nach der "Access Time" - also der Zeit, zu der die Datei zuletzt verwendet (gelesen, geschrieben oder Verzeichnisse aufgelistet) wurden.
    "N" steht für die Anzahl an Tagen.
    "-atime 1" Dateien und Verzeichnisse, die vor einem Tag das letzte mal verwendet wurden
    "-atime +1" Dateien und Verzeichnisse, die vor mehr als einem Tag das letzte mal verwendet wurden
    "-atime -1" Dateien und Verzeichnisse, die vor weniger als einem Tag das letzte mal verwendet wurden

    Listen Sie alle Dateien in Ihrem Homeverzeichnis auf die in den letzten 24 Stunden verwendet wurden
  4. Die Option -mtime N filtert das Ergebnis nach der "Modify Time" - also der Zeit, zu der die Datei zuletzt bearbeitet / geändert wurde.
    "N" steht für die Anzahl an Tagen.
    "-mtime 1" Dateien und Verzeichnisse, die vor einem Tag das letzte mal bearbeitet wurden
    "-mtime +1" Dateien und Verzeichnisse, die vor mehr als einem Tag das letzte mal bearbeitet wurden
    "-mtime -1" Dateien und Verzeichnisse, die vor weniger als einem Tag das letzte mal bearbeitet wurden

    Listen Sie alle Dateien in Ihrem Homeverzeichnis auf die in den letzten 24 Stunden bearbeitet wurden

Weitere umfangreiche Beispiele finden Sie hier.