Inhalt dieses Kapitels
Drei Suchwerkzeuge — wann was?
Einstieg| Werkzeug | Was sucht es? | Geschwindigkeit | Wann benutzen? |
|---|---|---|---|
find | Dateien & Verzeichnisse nach beliebigen Kriterien | langsam (durchsucht live) | Wenn du genau wissen willst, wo etwas ist — und nach mehreren Kriterien filtern willst |
locate | Dateien nach Name | sehr schnell (Datenbank) | Wenn du nur grob den Namen weißt und schnell finden willst |
which | Programme im $PATH | sehr schnell | „Wo liegt das Programm, das ich gerade aufrufe?" |
whereis | Programme + Manuals + Quellen | sehr schnell | Wie which, aber findet zusätzlich Manpages |
- Suchst du Daten im Dateisystem? →
find(immer aktuell) oderlocate(schneller, aber evtl. veraltet) - Suchst du ein Programm? →
whichoderwhereis
Im Alltag wirst du find 80 % der Zeit
benutzen — locate wenn's schnell gehen muss, die
anderen beiden sind Spezialwerkzeuge.
find — der Profi-Sucher
Pflicht
Grundformel
| Teil | Bedeutung | Default |
|---|---|---|
| WO | Verzeichnis, ab dem gesucht wird | aktuelles Verzeichnis (.) |
| KRITERIUM | Was soll gefunden werden? | alles anzeigen |
| AKTION | Was soll mit den Treffern passieren? | nur ausgeben (-print) |
Der einfachste find-Aufruf
# Alles ab dem aktuellen Verzeichnis anzeigen
find .
# Alles in /etc/ anzeigen
find /etc
Die wichtigsten Kriterien
| Kriterium | Bedeutung | Beispiel |
|---|---|---|
-name "muster" | Name (case-sensitive!) | find . -name "*.log" |
-iname "muster" | Name (case-insensitive) | find . -iname "readme*" |
-type f | nur Dateien | find . -type f |
-type d | nur Verzeichnisse | find . -type d |
-type l | nur Symlinks | find . -type l |
-size +1M | größer als 1 MB | find . -size +1M |
-size -10k | kleiner als 10 KB | find . -size -10k |
-mtime -1 | in den letzten 24h geändert | find . -mtime -1 |
-mtime +30 | älter als 30 Tage geändert | find . -mtime +30 |
-user admin | gehört User admin | find /home -user admin |
-group wheel | gehört Gruppe wheel | find /etc -group wheel |
-nameist case-sensitive:find . -name "readme*"findetreadme.txt, aber nichtREADME.md. Für case-insensitive:-iname.- Wildcards in Anführungszeichen:
find . -name "*.log"(mit Quotes!) — sonst expandiert die Shell das*bevorfindlä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:
# 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):
# Alle .log ODER .conf-Dateien
find /etc \( -name "*.log" -o -name "*.conf" \)
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.
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 644— exakt 644-perm -644— mindestens 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?
find /etc -perm -o+w 2>/dev/null
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
# 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!
# 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
# 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 {} \;
{}- und \;-Magie{}ist ein Platzhalter —findersetzt 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 +:
find /etc -name "*.conf" -exec chmod 644 {} +
-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)
locate — die schnelle Alternative
Pflicht
locatedurchsucht 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
# 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
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.
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_rsaauf dem System?" —locate id_rsa
which & whereis — wo steckt das Programm?
Pflicht
Spezialwerkzeuge: nur für ausführbare Programme im
$PATH.
which — wo liegt das Programm, das ich aufrufe?
# 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
# 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
which/whereis?- Welche Version wird aufgerufen? Wenn mehrere
Versionen eines Programms installiert sind:
which befehlzeigt, welche die Shell findet - Skript-Pfade prüfen: Vor einem Cron-Job mit
which befehlden vollen Pfad rausfinden - Doppelt installierte Programme finden:
whereis -b mysqlzeigt alle Binärdateien
▶ Tiefer einsteigen: PATH und Programm-Auffindung
whichschaut in der Umgebungsvariablen$PATHnach- 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)
📧 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:
- Alle Konfigurationsdateien in
/etc/— wie viele sind es? - Größere Dateien in deinem Home — die fliegen meist auf, wenn jemand was abgelegt hat, wo er nicht sollte.
- Kürzlich geänderte Dateien in den letzten 7 Tagen.
- Wo unsere wichtigsten Tools liegen — damit wir's dokumentieren können.
- 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
- Erstelle
~/audit-2/test/und darin die Unterordnerconfigs/,logs/,data/in einem Befehl (Brace Expansion!). - Befülle die Ordner mit Test-Dateien:
configs/: drei.conf-Dateien mit beliebigem Inhaltlogs/: zwei.log-Dateien
- Kopiere
/etc/passwdnach~/audit-2/test/data/grossedatei.txt— das ist eine echte System-Datei und passend groß für die spätere Suche. - Schau dir das Ergebnis mit
ls -la ~/audit-2/test/an.
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
find-Übung im echten System (12 min)- Finde alle
.conf-Dateien in/etc/. Zähle die Anzahl mit einer Pipe anwc -l. - Finde alle Dateien in deinem Home, die größer als 1 KB sind.
- Finde alle Dateien in
/etc/, die in den letzten 7 Tagen geändert wurden. - Finde alle leeren Dateien in deinem Home
(
-empty).
# 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
- Wechsle in
~/audit-2/test/. Finde dort alle Dateien, die NICHT mit.confenden. Tipp:!invertiert. - Finde nur die Verzeichnisse in
~/audit-2/test/. - Finde alle Dateien mit der Endung
.logODER.conf(Achtung: Klammern!).
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" \)
-exec für Berechtigungs-Normalisierung (10 min)- Setze in
~/audit-2/test/mitfindund-execalle Dateien auf644und alle Verzeichnisse auf755. (Endlich die saubere Variante der Bonus-Aufgabe aus Lab 2.5!) - Prüfe mit
ls -la ~/audit-2/test/configs/, ob die Dateien jetzt644haben. - Finde alle Dateien, die NICHT die Berechtigung
644haben.
# 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
locate, which, whereis (8 min)- Aktualisiere zuerst die
locate-Datenbank:sudo updatedb(fallslocateinstalliert ist; falls nicht, mitsudo dnf install mlocate -ynachinstallieren). - Suche mit
locatenachsshd_config. Wo wird er fündig? - Mit
whichherausfinden, wols,catundgrepauf dem System liegen. - Mit
whereis lsherausfinden, wo das Programm UND seine Manpage liegen.
# 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
Drei kleine Bonus-Aufgaben — jede probiert eine zusätzliche Option aus, die du gerade kennengelernt hast. Eine Zeile pro Aufgabe.
- Case-insensitive Suche: Erstelle in
~/audit-2/test/eine DateiREADME.md(Großbuchstaben!). Suche dann mitfindnachreadme*— was passiert? Probier dann-inamestatt-name. - Kleine Dateien finden: Finde in
~/audit-2/test/alle Dateien, die kleiner als 100 Bytes sind. Tipp: Größe mitcstattkfür Bytes,-für „kleiner als". locatemit Wildcards: Finde mitlocatealle Dateien auf dem System, die im NamennginxUND.confenthalten. Tipp:locateversteht Wildcards — schreib das Suchmuster mit*.
# 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"
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!
Typische Anfänger-Fehler
Vorsichtfind . -name *.log (ohne Anführungszeichen) — die
Shell expandiert das * bevor
find läuft. Wenn nichts passt, gibt's komische Fehler.
Richtig: find . -name "*.log".
-delete ohne Vorab-TestDirekt find . -name "*.tmp" -delete ohne vorher zu
prüfen, was getroffen wird. Klassische „Hoppla, war nicht so
gemeint"-Katastrophe.
-exec ohne \;find . -exec chmod 644 {} (ohne
Backslash-Semikolon am Ende) → „missing argument to `-exec`". Das
\; ist Pflicht — oder als Alternative +.
locate zeigt nicht-existierende DateienDu hast eine Datei gelöscht, locate zeigt sie aber
noch. Die Datenbank ist veraltet — sudo updatedb oder
find benutzen.
find ohne 2>/dev/nullfind / -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- Was ist der Unterschied zwischen
findundlocate? - Welcher Befehl findet alle
.log-Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen? - Was bedeutet
-mtime -7infind? - Wie kombinierst du mehrere Kriterien in
findmit ODER? - Was ist der Platzhalter für jeden Treffer bei
find -exec? - Wozu dient
2>/dev/nullbeifind? - Warum kann
locateveraltete Ergebnisse zeigen, und wie behebst du das? - Welcher Befehl zeigt dir, wo das Programm
lsliegt? - Was ist der Unterschied zwischen
whichundwhereis? - Erstelle einen
find-Befehl, der in/var/log/alle.log-Dateien älter als 30 Tage findet und löscht.
finddurchsucht das Dateisystem live — immer aktuell, aber langsam.locatebenutzt eine vorgenerierte Datenbank — sehr schnell, aber evtl. veraltet.find . -name "*.log"— der Punkt steht für „hier ab",finddurchsucht standardmäßig rekursiv.- „Modifikationszeit weniger als 7 Tage her" — also alle Dateien, die in der letzten Woche geändert wurden.
- Mit
-o(or) und Klammern:find . \( -name "*.log" -o -name "*.conf" \). {}—findersetzt das beim Ausführen durch jeden gefundenen Pfad.- 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.
- Weil die Datenbank standardmäßig nur einmal
täglich aktualisiert wird. Manuelle Aktualisierung mit
sudo updatedb. which lsoderwhereis ls.whichzeigt nur den Pfad zur ausführbaren Datei im$PATH.whereiszeigt zusätzlich Manpages und Quellcode (falls verfügbar).find /var/log -name "*.log" -mtime +30 -delete(oder mit-exec rm {} \;).