Archiv der Kategorie: Linux Howto

THINK UNBLOG GNU/Linux Tutorials Howto Workaround DevOps Code

Textzeilen vor der ersten Zeile einer Datei einfügen

Beim Bearbeiten von Textdateien in der Linux-Shell werden Textzeilen aus einer Datei häufig am Ende an eine andere Datei angehängt. Sollen Textzeilen am Anfang einer Datei eingefügt werden, oder der Inhalt einer Datei am Anfang einer anderen Datei hinzugefügt werden, zeigt dieser Artikel dies wie folgt.

Textzeilen am Anfang einer Datei hinzufügen

Zum Filtern und Transformieren von Text können wir den sed – Stream-Editor verwenden, mit der In-Place Option (-i) und (i) zum Einfügen von Text.

$ sed -i '1 i\insert this before' file.txt

Auch hier macht der folgende Befehl dasselbe.

$ sed -i '1i insert this before' file.txt

Mehrere Textzeilen oben zu Beginn in Textdatei einfügen.

$ sed -i '1i first line\nsecond line\nthird line' file.txt

Möchte man dass der Inhalt einer Datei oben in einer anderen Datei eingefügt wird, ist dieser Befehl auszuführen.

$ printf '%s\n' '0r file.1st' x | ex file.2nd

Dadurch wird file.2nd in ex geöffnet (Vim im Ex Mode), der vollständige Inhalt von file.1st oben eingelesen und der geänderte Puffer dann wieder in file.2nd gespeichert.

In diesem Beispiel hat die Datei file.1st den folgenden Inhalt.

first line
second line
third line

Die zweite Datei hat den nachstehenden Inhalt.

fourth line
fifth line
sixth line

Nach dem zusammenführen hat file.2nd diesen Inhalt.

first line
second line
third line
fourth line
fifth line
sixth line

Dateien Suchen nach Änderungsdatum mit Find mtime

Find ist der Befehl der Wahl, wenn nach Dateien und ihrem Änderungsdatum auf dem Filesystem gesucht wird. Das Command Line Tool bietet zahlreiche Optionen mit viele Möglichkeiten, auch für die Anwendung in Shell-Scripts. Der Befehl find --help gibt dabei Hilfe, und man find zeigt die ausführliche Manpage.

find iname mtime atime

Datei Suchen nach Änderungsdatum mit find option mtime

Im Filesystem besitzt jede Datei drei Zeitstempel, die geändert werden, wann bestimmte Operationen an der Datei durchgeführt werden:

  • [a] access (den Inhalt der Datei lesen) – atime
  • [b] den Status ändern (die Datei oder ihre Attribute ändern) – ctime
  • [modify] (den Inhalt der Datei ändern) – mtime

Es lässt sich nach Dateien suchen, deren Zeitstempel innerhalb eines bestimmten Altersbereichs liegen, oder sie können mit anderen Zeitstempeln verglichen werden.

Find Option -mtime (modify)

Die Option -mtime gibt eine Liste der Dateien zurück, wenn auf die Datei zuletzt vor N*24 Stunden zugegriffen wurde. Um beispielsweise eine Datei des letzten Monats (N=30 Tagen) zu finden, kann die Option -mtime +30 verwendet werden.

  • -mtime +30 bedeutet Datei suchen, die vor 30 Tagen geändert wurde.
  • -mtime -30 bedeutet weniger als 30 Tage.
  • -mtime 30 ohne + oder – bedeutet genau 30 Tage.

Um beispielsweise Textdateien zu finden, die vor 30 Tagen zuletzt geändert wurden, verwende diesen Befehl:

$ find /home/user -iname "*.txt" -mtime -30 -print

Inhalte von Dateien anzeigen die zuletzt vor 30 Tagen geändert wurden:

$ find /home/user -iname "*.txt" -mtime -30 -exec cat {} \;

Die Gesamtzahl der TXT-Dateien zählen mit dem Befehl wc (Word Count):

$ find /home/user -iname "*.txt" -mtime -30 | wc -l

Gzip-Archiv Dateien die älter als 30 Tage sind löschen:

$ find /home/user/*.gz -mtime +30 -exec rm {} \;

Find Option -atime (access)

Nach Zugriffszeit suchen, der folgende Befehl gibt die Liste aller TXT-Dateien aus, auf die in den letzten 30 Tagen zugegriffen wurde:

$ find /home/user -iname "*.txt" -atime -30 -type -f

json-Dateien auflisten auf die vor genau 14 Tagen zugegriffen wurde:

$ find /home/user -iname "*.json" -atime 14 -type -f

Hinweis: Der Schalter -type f – sucht nur nach Dateien, ohne Verzeichnisse.

Find kann Zeichenfolgen rekursiv in allen Dateien ab dem aktuellen Verzeichnis finden.

$ find . -type f -print0 | xargs -0 grep "some string"

Beispiel: Dateien rekursiv mit chmod ab dem aktuellen Verzeichnis ändern, jedoch nicht die Verzeichnisse.

$ find . -type f -print0 | xargs -0 chmod 0644

und umgekehrt, alle Verzeichnisse rekursiv mit chmod ab dem aktuellen Verzeichnis ändern, aber nicht die Dateien.

$ find . -type d -print0 | xargs -0 chmod 0755

Find Option -daystart

Die Option -daystart wird verwendet, um die Zeit ab Beginn des aktuellen Tages statt vor 24 Stunden zu messen. Finde alle gestern geänderten C++ Dateien (*.CPP) mit folgendem Befehl:

$ find /home/user -iname "*.CPP" -daystart -mtime 1

Um alle LOG-Dateien in /var/log aufzulisten, auf die gestern zugegriffen wurde, gilt der folgende Befehl:

$ find /var/log -iname "*.log" -daystart -mtime 1 -type f

C++ Dateien auflisten die vor 2-7 Tagen geändert wurden:

$ find /home/user -iname "*.CPP" -daystart -mtime 2 -mtime -7

Um Dateien im Verzeichnisbaum /home/user zu finden, die neuer sind als die Datei /mnt/user, führe folgendes aus:

$ find home/user -newer /mnt/user

Fazit

Mit dem Befehlszeilentool find lassen sich in der Linux Shell Dateien nach ihrem Änderungsdatum finden. Das Command Line Tool bietet mit den zahlreichen Optionen viele Möglichkeiten, diese auch in der Scriptverarbeitung nützlich sind.