Kategorie: Bash

  • Führende Nullen in Dateinamen unter Linux hinzufügen

    Wenn Sie viele Dateien haben, die durchnummeriert sind, aber ohne führende Nullen, kann die Sortierung manchmal durcheinander geraten. Ein typisches Beispiel könnte eine Sammlung von Bilddateien sein, die als img_1.jpg, img_2.jpg, img_100.jpg usw. nummeriert sind. In diesem Fall wird img_100.jpg vor img_2.jpg sortiert, da die Sortierung als Zeichenkette und nicht numerisch erfolgt.

    Dieses Problem lässt sich lösen, indem man ein einfaches Bash-Skript verwendet, das durch alle Dateien geht und diejenigen umbenennt, die weniger als eine bestimmte Anzahl von Ziffern in ihrem Namen haben, in unserem Fall drei. Hier ist, wie Sie das tun können:

    for file in img_*.jpg; do
        # Extrahiere die Nummer aus dem Dateinamen
        num=$(echo $file | grep -o -E '[0-9]+')
    
        # Überprüfe, ob die Nummer weniger als 3 Stellen hat
        if [ ${#num} -lt 3 ]; then
            # Füge führende Nullen hinzu, um die Länge auf 3 zu bringen
            new_num=$(printf "%03d" $num)
    
            # Generiere den neuen Dateinamen
            new_file="img_${new_num}.jpg"
    
            # Umbenennen der Datei
            mv $file $new_file
        fi
    done
    

    Dieses Skript extrahiert den numerischen Teil jedes Dateinamens, prüft seine Länge und fügt gegebenenfalls führende Nullen hinzu, um die Länge auf drei Stellen zu bringen. Es ignoriert Dateien, die bereits eine dreistellige Nummer haben.

    Bitte beachten Sie, dass das Skript davon ausgeht, dass alle Ihre Dateien im Format img_N.jpg vorliegen, wobei N eine Zahl ohne führende Nullen ist. Wenn Ihr Dateiformat abweicht, müssen Sie das Skript entsprechend anpassen.

    Zudem sollten Sie beachten, dass dieses Skript keine Sicherheitsmaßnahmen implementiert, um sicherzustellen, dass keine Dateien überschrieben werden. Stellen Sie daher sicher, dass Sie eine Sicherungskopie Ihrer Dateien haben, bevor Sie das Skript ausführen.

  • Ändern der Zeitzone auf einem Debian System

    Um die Zeitzone auf einem Debian System zu ändern, können Sie die folgenden Schritte ausführen:

    1. Öffnen Sie das Terminal oder eine SSH-Verbindung zum Server.
    2. Überprüfen Sie die aktuelle Zeitzone des Systems mit dem Befehl timedatectl.
    3. Geben Sie den Befehl timedatectl set-timezone gefolgt von der Bezeichnung der neuen Zeitzone ein, um die Zeitzone zu ändern.
    4. Ersetzen Sie „Europe/Berlin“ durch den Namen der gewünschten Zeitzone. Eine Liste aller verfügbaren Zeitzone finden Sie unter /usr/share/zoneinfo/.
    5. Überprüfen Sie erneut die Zeitzone mit dem Befehl „timedatectl", um sicherzustellen, dass die Änderung erfolgreich war.

    Stellen Sie sicher, dass Sie über ausreichende Berechtigungen auf dem System verfügen, um diese Änderungen vorzunehmen

  • Dateien älter als ein bestimmtes Datum unter Linux löschen

    Verwenden Sie den folgenden Befehl, um Dateien zu finden und zu löschen, die älter sind als ein bestimmtes Datum:

    find /pfad/zum/verzeichnis -type f -not -newermt 'YYYY-MM-DD' -print0 | xargs -0 rm

    Bevor Sie den Befehl ausführen, empfiehlt es sich, die gefundenen Dateien ohne den | xargs -0 rm-Teil zu überprüfen, dass wirklich nur die gewünschten Daten gelöscht werden.

  • Anonymisieren von IP-Adressen in einer Apache Log Datei mithilfe von sed

    Ziel: Man möchte die IP-Adressen in einer Apache Logdatei anonymisieren, indem man das letzte Byte oder die zwei letzten Byte der IP-Adresse durch 0 ersetzt.

    Lösungsmöglichkeit: Zeilenweises Durchsuchen der Logdatei mit dem Unix Werkzeug sed. Suchen der IP-Adressen und Ersetzen der Fundstellen mit der anonymiserten IP-Adresse.
    Z. B. soll die IP-Adresse 123.123.123.123 durch die Adresse 123.123.0.0 ersetzt werden.

    Dazu kann man folgenden Einzeiler verwenden:

    sed -i -e 's/\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)/\1\.\2\.0\.0/' access_log_ssl.log

    Hier der Versuch einer Erklärung, ohne zu tief auf die regulären Ausdrücke, die in dem sed-Skript verwendet werden, einzugehen.

    Vereinfacht sieht das sed-Skript wie folgt aus:

    sed -i -e 's/SUCHMUSTER/ERSETZUNG/g' access_log.log

    -e = Parameter der angibt, dass ein sed-Script folgt
    ’s/SUCHMUSTER/ERSETZUNG/g‘ = sed-Skript
    SUCHMUSTER = Muster, nach dem gesucht werden soll
    ERSETZUNG = Text, mit dem das Suchmuster ersetzt werden soll
    access_log.log = Eingabedatei
    -i = Inplace Bearbeitung – die Änderungen werden direkt an der Eingabedatei ausgeführt

    Sollen die Änderungen in einer Kopie gespeichert werden, dann wird sed ohne den -i Parameter benutzt und die Ausgabe in eine neue Datei umgeleitet.

    sed -e 's/SUCHMUSTER/ERSETZUNG/g' access_log.log > bearbeitet.log

    In diesem Fall bleibt die Eingabedatei unverändert und die Änderungen werden in der Datei bearbeitet.log gepeichert.

    Jetzt zu dem konkreten Beispiel:

    Der besseren Lesbarkeit halber wurden die vielen Maskierungen mit dem Zeichen \ entfernt. Diese werden aber in dem eigentlichen sed-Skript benötigt.

    Hier das Suchmuster in unserem sed-Skript:

    ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})

    [0-9] = Die Zeichen 0-9, also 0123456789 werden an dieser Stelle gesucht
    {1,3} = Die Zeichen [0-9] müssen 1 bis 3 mal auftreten
    ([0-9]{1,3}) = Die Klammern kennzeichnen eine Einheit in dem Suchmuster, auf die anschließend beim Ersetzten zugegriffen werden kann
    ([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}) = Das Muster muss vier Mal, getrennt duch einen Punkt, hintereinander auftreten.

    Damit hat man aber keine hundertprozentige Sicherheit, dass nur gültige IPv4 Adressen von dem Suchmuster gefunden werden. Ungültige Adressen wie z.B. 999.999.999.999 würden duch das Suchmuster auch gefunden.
    Für unseren Anwendungsfall reicht das vereinfachte Suchmuster aber vollkommen aus.

    Jetzt zu dem ersetzen Teil des sed-Skripts. Auch hier sind die Maskierungen durch das Zeichen \ weggelassen.

    \1.\2.0.0

    \1 = Die erste mit Klammern definierte Einheit im Suchmuster
    \2 = Die zweite mit Klammern definierte Einheit im Suchmuster; analog dazu könnte man noch \3 und \4 für die dritte und vierte Einheit im Suchmuster benutzen. \1.\2.\3.\4 würde die ursprüngliche IP unverändert ausgeben.
    0 = Die Ziffer 0

    Der Ersetzen-Teil des sed-Skripts bedeutet also, dass eine gefundene IP-Adresse mit ihren ersten zwei Bytes und mit einer Null als drittes und viertes Byte ersetzt werden sollen.

  • Aktivieren des Bash-Completion-Features auf einem Debian-System

    Wenn das Bash-Completion-Feature auf Debian-Systemen richtig funktioniert, kann man z. B. die Dienste beim Service-Kommando mit der Tabulatortaste vervollständigen.

    Beispiel für die Befehlsvervollständigung:

    service ap<Tab>
    service apache2 rel<Tab>
    service apache2 reload

    Wenn auf einem Debian-System die Vervollständigung von Befehlen mittels der Tabulatortaste nicht funktioniert, kann es sein, dass das Paket Bash-Completion nicht installiert ist.

    Um zu überprüfen, ob das Bash-Completion-Paket installiert ist, kann man folgenden Befehl benutzen:

    dpkg -l bash-completion | tail -1

    Die Ausgabe des Befehls sollte dann wie folgt aussehen:

    ii  bash-completion 1:2.0-1 all programmable completion for the bash shell

    Bleibt diese Ausgabe leer, dann ist das Paket Bash-Completion nicht installiert. Es lässt sich mit folgendem Befehl installieren:

    apt-get install bash-completion

    Sollte die Bash-Vervollständigung trotz installiertem Paket Bash-Completion nicht funktionieren, kann es daran liegen, dass das Vervollständigungs-Feature noch nicht aktiviert wurde. Bei Debian kann man diese Funktion in der Datei /etc/bash.bashrc aktivieren. Man muss nur die Kommentarzeichen vor folgenden Zeilen entfernen:

    ###Vorher
    #if ! shopt -oq posix; then
    #  if [ -f /usr/share/bash-completion/bash_completion ]; then
    #    . /usr/share/bash-completion/bash_completion
    #  elif [ -f /etc/bash_completion ]; then
    #    . /etc/bash_completion
    #  fi
    #fi
    
    ###Nachher
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

    Damit diese Einstellung aktiv wird, muss man sich am System ab- und wieder anmelden.

    Quelle: http://serverfault.com

  • Autocomplete (tab completion) für Service-Kommando unter Debian Linux

    Wenn auf einem Debian-System die Autocomplete-Funktion nur bei Dateien und Verzeichnissen funktioniert und nicht für weitere Befehle, kann es daran liegen, dass das  „bash-completion“-Paket nicht installiert ist.

    Um die Autocomplete-Funktion z. B. auch für das „service“-Kommando verwenden zu können, muss unter Debian das Paket „bash-completion“ installiert sein.

    Installation des „bash-completion“-Pakets:

    apt-get install bash-completion

    Nach der Installation:
    Test der Funktionalität, Eingabe von „service a“ [TAB]:

    # service a
    acpid     anacron   apache2   asterisk  atd

    Nun schlägt die Bash Shell nach der Eingabe von „service a“ und dem Drücken der TAB -Taste alle zur Verfügung stehenden Dienste vor, die mit a beginnen.