Linux · Tag 2 · Kapitel 06 von 6

Dateien suchen

Wenn du nicht mehr weißt, wo eine Datei liegt — und das passiert öfter, als dir lieb ist — brauchst du Werkzeuge, die für dich suchen. find ist die mächtige Allzweck-Waffe, locate der schnelle Helfer, und which/whereis zeigen, wo Programme stecken. Damit hast du den letzten großen Baustein der Linux-Shell.

📚 Kapitel 06 ⏱️ ca. 30 min Theorie + 45 min Lab 🧪 Lab 2.6 (Schnitzeljagd)
Inhalt dieses Kapitels
6.1

Drei Suchwerkzeuge — wann was?

Einstieg
WerkzeugWas sucht es?GeschwindigkeitWann benutzen?
findDateien & Verzeichnisse nach beliebigen Kriterienlangsam (durchsucht live)Wenn du genau wissen willst, wo etwas ist — und nach mehreren Kriterien filtern willst
locateDateien nach Namesehr schnell (Datenbank)Wenn du nur grob den Namen weißt und schnell finden willst
whichProgramme im $PATHsehr schnell„Wo liegt das Programm, das ich gerade aufrufe?"
whereisProgramme + Manuals + Quellensehr schnellWie which, aber findet zusätzlich Manpages
📌
Faustregel
  • Suchst du Daten im Dateisystem? → find (immer aktuell) oder locate (schneller, aber evtl. veraltet)
  • Suchst du ein Programm? → which oder whereis

Im Alltag wirst du find 80 % der Zeit benutzen — locate wenn's schnell gehen muss, die anderen beiden sind Spezialwerkzeuge.

6.2

find — der Profi-Sucher

Pflicht

Grundformel

find [WO] [KRITERIUM] [AKTION]
TeilBedeutungDefault
WOVerzeichnis, ab dem gesucht wirdaktuelles Verzeichnis (.)
KRITERIUMWas soll gefunden werden?alles anzeigen
AKTIONWas soll mit den Treffern passieren?nur ausgeben (-print)

Der einfachste find-Aufruf

bash
# Alles ab dem aktuellen Verzeichnis anzeigen
find .

# Alles in /etc/ anzeigen
find /etc

Die wichtigsten Kriterien

KriteriumBedeutungBeispiel
-name "muster"Name (case-sensitive!)find . -name "*.log"
-iname "muster"Name (case-insensitive)find . -iname "readme*"
-type fnur Dateienfind . -type f
-type dnur Verzeichnissefind . -type d
-type lnur Symlinksfind . -type l
-size +1Mgrößer als 1 MBfind . -size +1M
-size -10kkleiner als 10 KBfind . -size -10k
-mtime -1in den letzten 24h geändertfind . -mtime -1
-mtime +30älter als 30 Tage geändertfind . -mtime +30
-user admingehört User adminfind /home -user admin
-group wheelgehört Gruppe wheelfind /etc -group wheel
📌
Wichtige Details bei Kriterien
  • -name ist case-sensitive: find . -name "readme*" findet readme.txt, aber nicht README.md. Für case-insensitive: -iname.
  • Wildcards in Anführungszeichen: find . -name "*.log" (mit Quotes!) — sonst expandiert die Shell das * bevor find läuft.
  • Zeitangaben in Tagen, nicht Stunden: -mtime -1 = „letzte 24 Stunden", -mtime -7 = „letzte Woche".
  • Größenangaben: c (Bytes), k (Kilobyte), M (Megabyte), G (Gigabyte). + heißt „größer als", - heißt „kleiner als".

Kriterien kombinieren

find kombiniert mehrere Kriterien standardmäßig mit UND:

bash
# Logs, die größer als 1 MB sind UND in den letzten 7 Tagen geändert wurden
find /var/log -name "*.log" -size +1M -mtime -7

# Verzeichnisse in /etc/, die der Gruppe wheel gehören
find /etc -type d -group wheel

Für ODER gibt es -o (mit Klammern, weil sonst Vorrang-Ärger):

bash
# Alle .log ODER .conf-Dateien
find /etc \( -name "*.log" -o -name "*.conf" \)
💡
Klammern und Backslash

Die runden Klammern bei -o müssen mit Backslash geschrieben werden: \( ... \). Sonst denkt die Shell, das wären Subshell-Aufrufe. Klingt komisch, ist aber so.

🛡️
Wozu brauchst du find im Admin-Alltag?
  • Aufräumen: Alte Logfiles finden — find /var/log -name "*.log.*" -mtime +30
  • Sicherheits-Audit: World-writable Dateien — find /etc -perm -o=w
  • Fehler-Forensik: Was wurde gestern geändert? — find /etc -mtime -1
▶ Mehr Use Cases — find in der Praxis
  • Große Disk-Fresser finden: find / -type f -size +100M 2>/dev/null
  • Leere Dateien aufspüren: find . -type f -empty
  • Leere Verzeichnisse löschen: find . -type d -empty -delete
  • Bestimmten User auf System suchen: find /home -user admin -type f
  • Verzeichnisse nach Modifikation: find /etc -type d -mtime -7
▶ Tiefer einsteigen: Berechtigungen mit -perm
  • -perm 644exakt 644
  • -perm -644mindestens diese Rechte (mehr ist erlaubt)
  • -perm /u+w — Owner hat Schreibrecht (egal was sonst)
  • -perm -o+w — world-writable (klassischer Sicherheits-Check!)

Beispiel: Welche Dateien sind world-writable in /etc?

bash
find /etc -perm -o+w 2>/dev/null
6.3

find mit Aktionen: -exec und -delete

Pflicht

find kann nicht nur anzeigen, was es gefunden hat — es kann auch Aktionen drauf ausführen. Das ist der mächtigste Teil.

-delete — direkt löschen

bash
# Alle .tmp-Dateien im aktuellen Baum löschen
find . -name "*.tmp" -delete

# Leere Verzeichnisse löschen
find . -type d -empty -delete
⚠️
-delete ist gnadenlos

-delete fragt nicht nach — es löscht sofort. Erst immer ohne -delete testen!

bash
# SCHRITT 1: Schauen, was getroffen würde
find . -name "*.tmp"

# SCHRITT 2: Erst dann löschen
find . -name "*.tmp" -delete

-exec — beliebigen Befehl auf jeden Treffer anwenden

bash
# Auf jeden Treffer wird der Befehl angewendet
# Wichtig: {} ist der Platzhalter für den Treffer
# Wichtig: \; oder ';' beendet den -exec-Befehl

# Alle .conf-Dateien auf 644 setzen
find /etc -type f -name "*.conf" -exec chmod 644 {} \;

# Alle Verzeichnisse in /var/www auf 755 setzen
find /var/www -type d -exec chmod 755 {} \;

# Alle .log-Dateien älter als 30 Tage löschen
find /var/log -name "*.log" -mtime +30 -exec rm {} \;
📌
Die {}- und \;-Magie
  • {} ist ein Platzhalter — find ersetzt das durch jeden Treffer
  • \; ist das Ende-Zeichen des Befehls — Backslash wegen der Shell
  • Alternativ: + statt \; — das ruft den Befehl mit allen Treffern auf einmal auf (schneller bei vielen Dateien)

Beispiel mit +:

bash
find /etc -name "*.conf" -exec chmod 644 {} +
🛡️
Wozu brauchst du -exec?
  • Berechtigungen rekursiv normalisieren: Verzeichnisse 755, Dateien 644 — sauberer als chmod -R!
  • Backup von vielen Dateien: find . -name "*.conf" -exec cp {} ~/backup/ \;
  • Massenumbenennung mit Skript: -exec mein-skript.sh {} \; (kommt in Tag 3)
6.4

locate — die schnelle Alternative

Pflicht
  • locate durchsucht eine Datenbank statt das Dateisystem
  • Vorteil: rasend schnell — auch über die ganze Festplatte
  • Nachteil: Datenbank wird nur einmal täglich aktualisiert (durch Cron-Job updatedb)
  • Auf manchen Rocky-Systemen nicht vorinstalliert: sudo dnf install mlocate -y

Code-Beispiele

bash
# Datei nach Name finden
locate sshd_config
# → /etc/ssh/sshd_config

# Nur den Dateinamen anzeigen (-b = basename)
locate -b sshd_config

# Case-insensitive
locate -i README

# Anzahl Treffer
locate -c "*.log"

# Datenbank manuell aktualisieren (braucht sudo!)
sudo updatedb
⚠️
locate sieht keine neuen Dateien

Eben erstellte Dateien findet locate nicht, weil sie noch nicht in der Datenbank sind. Im Zweifel mit find arbeiten oder vorher sudo updatedb ausführen.

🛡️
Wozu brauchst du locate?
  • Schnellsuche nach Configs: „Wo war doch gleich die nginx-Config?" — locate nginx.conf
  • Find-Lite: Wenn du nur den Namen kennst und schnell prüfen willst, ob's was gibt
  • Sicherheits-Audit: „Gibt es irgendwo ein id_rsa auf dem System?" — locate id_rsa
6.5

which & whereis — wo steckt das Programm?

Pflicht

Spezialwerkzeuge: nur für ausführbare Programme im $PATH.

which — wo liegt das Programm, das ich aufrufe?

bash
# Wo liegt der Befehl, der bei "ls" aufgerufen wird?
which ls
# → /usr/bin/ls

# Mehrere Programme auf einmal
which ls cat grep
# → /usr/bin/ls
# → /usr/bin/cat
# → /usr/bin/grep

whereis — Programm + Manuals + Quellen

bash
# Alles zu einem Programm finden
whereis ls
# → ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

# Nur Binaries
whereis -b ls

# Nur Manpages
whereis -m ls
🛡️
Wozu brauchst du which/whereis?
  • Welche Version wird aufgerufen? Wenn mehrere Versionen eines Programms installiert sind: which befehl zeigt, welche die Shell findet
  • Skript-Pfade prüfen: Vor einem Cron-Job mit which befehl den vollen Pfad rausfinden
  • Doppelt installierte Programme finden: whereis -b mysql zeigt alle Binärdateien
▶ Tiefer einsteigen: PATH und Programm-Auffindung
  • which schaut in der Umgebungsvariablen $PATH nach
  • Anzeigen mit echo $PATH — typische Werte: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
  • Reihenfolge zählt: was zuerst gefunden wird, wird ausgeführt
  • Eigene Skripte landen oft in /usr/local/bin (für alle User) oder ~/bin (nur du)
🧪 Lab 2.6 Schnitzeljagd — Audit-Vorbereitung 45 min

📧 Von: Markus Becker · IT-Leitung
An: Tim Schulz (du)
Betreff: Audit nächste Woche — Bestands-Inventur


Hi Tim,

letzte Aufgabe für heute! Die Auditoren wollen nächste Woche eine vollständige Bestandsaufnahme unseres Test-Servers. Ich brauch von dir eine Reihe von Suchen, damit wir vorbereitet sind und nicht überrascht werden.

Was du suchen sollst:

  1. Alle Konfigurationsdateien in /etc/ — wie viele sind es?
  2. Größere Dateien in deinem Home — die fliegen meist auf, wenn jemand was abgelegt hat, wo er nicht sollte.
  3. Kürzlich geänderte Dateien in den letzten 7 Tagen.
  4. Wo unsere wichtigsten Tools liegen — damit wir's dokumentieren können.
  5. Berechtigungen normalisieren in einem Test-Ordner (endlich die saubere find-Variante aus Bonus-Aufgabe 20 von Lab 2.5!).

Setz dich nochmal ran — wenn du das durchhast, kannst du Feierabend machen. Cheat-Sheet und Quiz machen wir morgen früh.

Danke!
— Markus

Teil A — Setup (5 min)
  1. Erstelle ~/audit-2/test/ und darin die Unterordner configs/, logs/, data/ in einem Befehl (Brace Expansion!).
  2. Befülle die Ordner mit Test-Dateien:
    • configs/: drei .conf-Dateien mit beliebigem Inhalt
    • logs/: zwei .log-Dateien
  3. Kopiere /etc/passwd nach ~/audit-2/test/data/grossedatei.txt — das ist eine echte System-Datei und passend groß für die spätere Suche.
  4. Schau dir das Ergebnis mit ls -la ~/audit-2/test/ an.
bash
mkdir -p ~/audit-2/test/{configs,logs,data}
cd ~/audit-2

# Configs
echo "# nginx config" > test/configs/nginx.conf
echo "# database config" > test/configs/database.conf
echo "# app config" > test/configs/app.conf

# Logs
echo "log entry 1" > test/logs/access.log
echo "error entry" > test/logs/error.log

# Echte Systemdatei als "größere" Test-Datei kopieren
cp /etc/passwd test/data/grossedatei.txt

ls -la test/
ls -lh test/data/grossedatei.txt
Teil B — find-Übung im echten System (12 min)
  1. Finde alle .conf-Dateien in /etc/. Zähle die Anzahl mit einer Pipe an wc -l.
  2. Finde alle Dateien in deinem Home, die größer als 1 KB sind.
  3. Finde alle Dateien in /etc/, die in den letzten 7 Tagen geändert wurden.
  4. Finde alle leeren Dateien in deinem Home (-empty).
bash
# 5) Configs in /etc/ zählen
find /etc -name "*.conf" 2>/dev/null | wc -l

# 6) Dateien über 1 KB im Home
find ~ -type f -size +1k

# 7) Was wurde letzte Woche in /etc/ geändert?
find /etc -mtime -7 2>/dev/null

# 8) Leere Dateien im Home
find ~ -type f -empty
Teil C — Eigene Test-Umgebung durchsuchen (10 min)
  1. Wechsle in ~/audit-2/test/. Finde dort alle Dateien, die NICHT mit .conf enden. Tipp: ! invertiert.
  2. Finde nur die Verzeichnisse in ~/audit-2/test/.
  3. Finde alle Dateien mit der Endung .log ODER .conf (Achtung: Klammern!).
bash
cd ~/audit-2/test

# 9) Alles AUSSER .conf
find . ! -name "*.conf"

# 10) Nur Verzeichnisse
find . -type d

# 11) .log ODER .conf
find . \( -name "*.log" -o -name "*.conf" \)
Teil D — -exec für Berechtigungs-Normalisierung (10 min)
  1. Setze in ~/audit-2/test/ mit find und -exec alle Dateien auf 644 und alle Verzeichnisse auf 755. (Endlich die saubere Variante der Bonus-Aufgabe aus Lab 2.5!)
  2. Prüfe mit ls -la ~/audit-2/test/configs/, ob die Dateien jetzt 644 haben.
  3. Finde alle Dateien, die NICHT die Berechtigung 644 haben.
bash
# 12) Saubere Normalisierung
find ~/audit-2/test -type d -exec chmod 755 {} \;
find ~/audit-2/test -type f -exec chmod 644 {} \;

# 13) Prüfen
ls -la ~/audit-2/test/configs/
# → alle -rw-r--r--

# 14) Was hat NICHT 644?
find ~/audit-2/test -type f ! -perm 644
# → sollte leer sein
Teil E — locate, which, whereis (8 min)
  1. Aktualisiere zuerst die locate-Datenbank: sudo updatedb (falls locate installiert ist; falls nicht, mit sudo dnf install mlocate -y nachinstallieren).
  2. Suche mit locate nach sshd_config. Wo wird er fündig?
  3. Mit which herausfinden, wo ls, cat und grep auf dem System liegen.
  4. Mit whereis ls herausfinden, wo das Programm UND seine Manpage liegen.
bash
# 15) Datenbank aktualisieren
sudo dnf install mlocate -y    # falls nicht installiert
sudo updatedb

# 16) locate
locate sshd_config

# 17) which mit bekannten Programmen
which ls cat grep
# → /usr/bin/ls
# → /usr/bin/cat
# → /usr/bin/grep

# 18) whereis mit Manpage
whereis ls
# → ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
🌟 Bonus für schnelle Teilnehmer
📌

Drei kleine Bonus-Aufgaben — jede probiert eine zusätzliche Option aus, die du gerade kennengelernt hast. Eine Zeile pro Aufgabe.

  1. Case-insensitive Suche: Erstelle in ~/audit-2/test/ eine Datei README.md (Großbuchstaben!). Suche dann mit find nach readme* — was passiert? Probier dann -iname statt -name.
  2. Kleine Dateien finden: Finde in ~/audit-2/test/ alle Dateien, die kleiner als 100 Bytes sind. Tipp: Größe mit c statt k für Bytes, - für „kleiner als".
  3. locate mit Wildcards: Finde mit locate alle Dateien auf dem System, die im Namen nginx UND .conf enthalten. Tipp: locate versteht Wildcards — schreib das Suchmuster mit *.
bash
# 19) Case-insensitive Suche
touch ~/audit-2/test/README.md

# Mit -name (case-sensitive) — findet nichts
find ~/audit-2/test -name "readme*"

# Mit -iname (case-insensitive) — findet README.md
find ~/audit-2/test -iname "readme*"

# 20) Kleine Dateien
find ~/audit-2/test -type f -size -100c

# 21) locate mit Wildcards
locate "*nginx*.conf"
🎉
Lab 2.6 geschafft? Tag 2 ist durch!

Du hast jetzt alle wichtigen Such- und Filter-Werkzeuge der Linux-Shell. find ist das mächtigste davon — viele Admins benutzen es täglich. Und du hast endlich die saubere Variante für die Berechtigungs-Normalisierung gelernt, die in Lab 2.5 als Bonus angeteasert war.

Morgen früh: kleines Tages-Quiz + Cheat-Sheet, und dann geht's frisch in Tag 3!

6.7

Typische Anfänger-Fehler

Vorsicht
Fehler 1 — Wildcards ohne Quotes

find . -name *.log (ohne Anführungszeichen) — die Shell expandiert das * bevor find läuft. Wenn nichts passt, gibt's komische Fehler. Richtig: find . -name "*.log".

Fehler 2 — -delete ohne Vorab-Test

Direkt find . -name "*.tmp" -delete ohne vorher zu prüfen, was getroffen wird. Klassische „Hoppla, war nicht so gemeint"-Katastrophe.

Fehler 3 — -exec ohne \;

find . -exec chmod 644 {} (ohne Backslash-Semikolon am Ende) → „missing argument to `-exec`". Das \; ist Pflicht — oder als Alternative +.

Fehler 4 — locate zeigt nicht-existierende Dateien

Du hast eine Datei gelöscht, locate zeigt sie aber noch. Die Datenbank ist veraltet — sudo updatedb oder find benutzen.

Fehler 5 — find ohne 2>/dev/null

find / -name "x.conf" durchsucht das ganze System UND zeigt jede „Permission denied"-Meldung. Bildschirm wird unleserlich. Lösung: 2>/dev/null am Ende, um Fehler zu verstecken (aus Kap. 01!).

🎯

Kontrollfragen zum Kapitel

Selbst-Check
  1. Was ist der Unterschied zwischen find und locate?
  2. Welcher Befehl findet alle .log-Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen?
  3. Was bedeutet -mtime -7 in find?
  4. Wie kombinierst du mehrere Kriterien in find mit ODER?
  5. Was ist der Platzhalter für jeden Treffer bei find -exec?
  6. Wozu dient 2>/dev/null bei find?
  7. Warum kann locate veraltete Ergebnisse zeigen, und wie behebst du das?
  8. Welcher Befehl zeigt dir, wo das Programm ls liegt?
  9. Was ist der Unterschied zwischen which und whereis?
  10. Erstelle einen find-Befehl, der in /var/log/ alle .log-Dateien älter als 30 Tage findet und löscht.
  1. find durchsucht das Dateisystem live — immer aktuell, aber langsam. locate benutzt eine vorgenerierte Datenbank — sehr schnell, aber evtl. veraltet.
  2. find . -name "*.log" — der Punkt steht für „hier ab", find durchsucht standardmäßig rekursiv.
  3. „Modifikationszeit weniger als 7 Tage her" — also alle Dateien, die in der letzten Woche geändert wurden.
  4. Mit -o (or) und Klammern: find . \( -name "*.log" -o -name "*.conf" \).
  5. {}find ersetzt das beim Ausführen durch jeden gefundenen Pfad.
  6. Es leitet Fehlermeldungen (stderr) in den Mülleimer um. Klassisch, um „Permission denied"-Meldungen auszublenden, wenn du als normaler User in Bereichen suchst, wo du keine Leserechte hast.
  7. Weil die Datenbank standardmäßig nur einmal täglich aktualisiert wird. Manuelle Aktualisierung mit sudo updatedb.
  8. which ls oder whereis ls.
  9. which zeigt nur den Pfad zur ausführbaren Datei im $PATH. whereis zeigt zusätzlich Manpages und Quellcode (falls verfügbar).
  10. find /var/log -name "*.log" -mtime +30 -delete (oder mit -exec rm {} \;).