Skip to main content

Suchen & Finden

Dateien suchen, ersetzen, umbenennen und anzeigen unter Linux

Praxisreferenz für find, grep, sed, rename und tree. Die Beispiele sind nach Aufgabe gruppiert und auf GNU-Tools (findutils, grep, sed) ausgelegt.

Vor destruktiven Aktionen (löschen, ersetzen) immer erst einen Trockenlauf machen: die Suche ohne -delete bzw. sed ohne -i ausführen und die Trefferliste prüfen. Erst danach scharf schalten.


1. Dateien nach Namen finden (find -name)

find -name sucht nach dem Dateinamen – nicht nach dem Inhalt.

Ab dem aktuellen Verzeichnis nach Dateien suchen, deren Name loopback enthält:

find . -name '*loopback*'

# Ergebnis
./.phoronix-test-suite/openbenchmarking.org/pts/network-loopback-1.0.1.zip
./.phoronix-test-suite/openbenchmarking.org/pts/serial-loopback-1.0.2.zip
./.phoronix-test-suite/test-profiles/pts/serial-loopback-1.0.2
./.phoronix-test-suite/test-profiles/pts/network-loopback-1.0.1

Groß-/Kleinschreibung ignorieren mit -iname:

find . -iname '*loopback*'

Alternative über grep auf die Dateiliste:

find . | grep loopback

Eine bestimmte Datei systemweit finden und die Treffer zählen:

find / -type f -name "index.html" | wc -l

2. Datei-Inhalte durchsuchen (grep)

grep sucht innerhalb der Dateien.

grep -RIn 'wiki' .

Mit erweiterten regulären Ausdrücken (-E) mehrere Alternativen suchen. Der Punkt ist in Regex ein Sonderzeichen und wird mit \. wörtlich gemeint:

grep -RInE "wiki\.l-sw\.it|intranet\.l-sw\.it" /etc/haproxy

Kontextzeilen um den Treffer anzeigen – -A danach, -B davor, -C beidseitig:

grep -RIn -C 3 'ServerName' /etc/apache2

Wichtige Optionen:

  • -R – rekursiv (folgt Symlinks; -r folgt ihnen nicht)
  • -I – ignoriert Binärdateien
  • -n – zeigt Zeilennummern
  • -i – ignoriert Groß-/Kleinschreibung
  • -E – erweiterte reguläre Ausdrücke (für |, +, ? ohne Escaping)
  • -l – zeigt nur Dateinamen mit Treffer; -L nur die ohne
  • --exclude-dir=.git – lässt Verzeichnisse aus

3. Nach Dateityp + Inhalt durchsuchen

Ein Verzeichnis rekursiv nach einem bestimmten Dateityp durchsuchen, der eine spezielle Zeichenkette enthält.

Beispiel: /tmp rekursiv durchsuchen und alle .log-Dateien finden, die keks enthalten:

find /tmp/ -iname '*.log' -exec grep -l "keks" {} +

# Ergebnis
/tmp/test/test3.log

{} + gegenüber {} \;: Mit + sammelt find möglichst viele Treffer und ruft grep nur einmal (bzw. wenige Male) mit allen Dateien auf – deutlich schneller. Mit \; wird grep für jede Datei einzeln gestartet. Funktional gleich, aber + ist bei vielen Dateien klar zu bevorzugen.


4. Dateien nach Alter finden und löschen

Anzahl aller Dateien in einem Verzeichnis (rekursiv) ermitteln:

find /verzeichnis -type f | wc -l

Dateien finden, die älter als 7 volle Tage sind:

find ./ -type f -mtime +7

Stolperfalle -mtime: find rechnet in vollen 24-Stunden-Einheiten und schneidet den Rest ab. -mtime +7 bedeutet daher „älter als 8×24 h“, findet also erst Dateien ab dem 8. Tag – die exakt 7 Tage alte Datei fällt heraus. Für „älter als 7 Tage“ im Alltagssinn ggf. -mtime +6 verwenden. Minuten-genau geht es mit -mmin.

Sicheres Löschen alter Dateien – zuerst nur anzeigen:

find /pfad -type f -mtime +7 -print

Stimmt die Liste, dasselbe find mit -delete abschließen:

find /pfad -type f -mtime +7 -delete

-delete ist find-intern, verträgt Leerzeichen und Sonderzeichen in Dateinamen problemlos und braucht keine Schleife. Die im Original genutzte for-Schleife über $(find ...) bricht dagegen bei Leerzeichen in Dateinamen und sollte vermieden werden.


5. Zuletzt geänderte Dateien finden

Rekursiv (inkl. Unterverzeichnisse), sortiert nach Änderungszeit – neueste zuletzt:

find . -type f -exec ls -ltrd {} +

Alternative, robust auch bei Leerzeichen und für „nur die letzten 10“:

find . -type f -printf '%T+ %p\n' | sort | tail -n 10

6. Suchen und ersetzen in Dateien (sed)

Quelle: tecchannel.de – Suchen und ersetzen in Dateien unter Linux

Eine einzelne Datei ersetzen – mit Backup

sed -i.bak "s/doof/lieb/g" /pfad/zur/datei

-i.bak ändert die Datei direkt und legt vorher eine Sicherung datei.bak an. Der Modifikator g ersetzt alle Treffer pro Zeile statt nur den ersten. Ohne Suffix (sed -i) gibt es keine Sicherung – auf Produktivsystemen riskant.

Vor dem In-Place-Edit prüfen, was sich ändern würde (Ausgabe nach stdout, Datei bleibt unangetastet):

sed "s/doof/lieb/g" /pfad/zur/datei

Alle Dateien in einem Ordner ersetzen

Beispiel: In allen Dateien unter /tmp/, deren Name mit test beginnt, doof durch lieb ersetzen. grep -rl liefert nur Dateien mit Treffer, sodass sed nicht unnötig läuft:

grep -rl doof /tmp/test* | xargs sed -i.bak -e 's,doof,lieb,g'

Dasselbe mit find:

find /<Pfad> -type f -exec sed -i.bak 's/<alt>/<neu>/g' {} +

Verzeichnistiefe begrenzen

In GNU find muss -maxdepth vor den Tests stehen:

find /srv/ -maxdepth 3 -type f -exec sed -i.bak 's/lan\.foo\.info/lan.foo.net/g' {} +

Nur bestimmte Dateitypen durchsuchen (deutlich schneller)

# Nur Config-Dateien (Apache, PHP, etc.)
find /srv/ -type f \( -name "*.conf" -o -name "*.php" -o -name "*.html" -o -name "*.xml" \) \
    -exec sed -i.bak 's/lan\.foo\.info/lan.foo.net/g' {} +

Bestimmte Verzeichnisse ausschließen

find /srv/ -type f \
    -not -path "*/cache/*" -not -path "*/tmp/*" -not -path "*/logs/*" \
    -exec sed -i.bak 's/lan\.foo\.info/lan.foo.net/g' {} +

Dateinamen mit Leerzeichen sicher verarbeiten

Wenn Dateinamen Leerzeichen oder Zeilenumbrüche enthalten können, ist find -print0 mit xargs -0 der saubere Weg – beide trennen über das Null-Byte statt über Leerzeichen:

find /srv/ -type f -name "*.conf" -print0 | xargs -0 sed -i.bak 's/alt/neu/g'

Legacy: ersetzen ohne sed -i (2 Schritte)

Nur nötig, wenn sed -i nicht verfügbar ist (z. B. manche BusyBox-Varianten). Erst in neue Dateien schreiben, dann umbenennen:

for i in *.html; do sed 's/Juni 2004/August 2004/' "$i" > "_$i"; done
for i in _*; do mv "$i" "${i#_}"; done

7. Mehrere Dateien umbenennen (rename)

Beispiel: Alle Dateien, die mit service beginnen, sollen das Präfix _deaktiviert_ erhalten.

Ausgangslage:

$ ls
service_bratwurst
service_schnitzel

Falls noch nicht installiert (Perl-Variante, Paket rename bzw. perl-rename):

sudo apt install rename

Umbenennen per regulärem Ausdruck:

rename 's/^service/_deaktiviert_service/' service*

Ergebnis:

$ ls
_deaktiviert_service_bratwurst
_deaktiviert_service_schnitzel

Hinweis: Es gibt zwei verbreitete rename-Programme mit unterschiedlicher Syntax – die Perl-Variante (oben, mit Regex) und die util-linux-Variante (rename alt neu datei). Mit rename --version lässt sich prüfen, welche installiert ist. Vor dem scharfen Lauf testet -n (Perl-Variante) den Vorgang trocken:

rename -n 's/^service/_deaktiviert_service/' service*

8. Verzeichnisstruktur anzeigen (tree)

Befehl Anzeige
tree Komplett mit Ordnern und Dateien
tree -d Nur Ordner
tree -L 2 Ordner und Dateien bis zur 2. Ebene
tree -d -L 2 Nur Ordner bis zur 2. Ebene
tree -a -L 2 Inkl. versteckter Dateien/Ordner bis zur 2. Ebene
tree -D Mit Datum der letzten Änderung (mtime; mit -c die ctime)
tree -h Mit Dateigrößen in lesbarer Form (K/M/G)

Falls tree nicht installiert ist: sudo apt install tree.