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
-deletebzw.sedohne-iausfü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;-rfolgt 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;-Lnur 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:findrechnet in vollen 24-Stunden-Einheiten und schneidet den Rest ab.-mtime +7bedeutet 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 +6verwenden. 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). Mitrename --versionlä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.
No comments to display
No comments to display