Nuetzliche Scripte: Unterschied zwischen den Versionen

Aus lugvswiki
Zur Navigation springenZur Suche springen
K (→‎BASH Skript: Führt ein komfortables und inkrementelles Backup/Restore aus: Erläuterung zu "-x" aus der Man-Page von "bash")
 
(102 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
==Nützliche Scripte==
 
==Nützliche Scripte==
 +
 +
Hier werden ein paar nützliche Scripte vorgestellt, die man '''nach Belieben anpassen kann'''. Ein Script (eigentlich im deutschen Skript) kennt man am wahrscheinlichsten als [https://de.wikipedia.org/wiki/Drehbuch Drehbuch]-Skript. Im Prinzip ist es aber genau dieses. Es ist ein Drehbuch für [https://de.wikipedia.org/wiki/Kommandozeile Kommandozeilen]-Befehle. Befehle auf der Kommandozeile werden wie ein militärischer Befehl auch, ohne weiteres Prüfen ausgeführt, sofern er bekannt und in der [https://de.wikipedia.org/wiki/Syntax Syntax] richtig ist! Da somit auch eine komplette Linuxinstallation unbrauchbar gemacht bzw. ohne Rückfrage gelöscht werden kann, sollte der Befehlsgeber die Befehle die er gibt und deren Auswirkungen ganz genau kennen! In Linux (und den anderen [https://de.wikipedia.org/wiki/Unix Unix] ähnlichen [https://de.wikipedia.org/wiki/Betriebssystem Betriebssystemen]) ist die Kommandozeile sehr mächtig. Verglichen mit Anweisungen, die jemand auf dem grafischen [https://de.wikipedia.org/wiki/Desktop_(grafische_Benutzeroberfläche) Desktop] umsetzen soll, sind Kommandozeilenbefehle (meist) unabhängig von der Distribution, Version und grafischen Oberfläche. Und somit sind sie, wenn man mit Linux schon länger unterwegs ist ein besseres Werkzeug, wenn man jemandem helfen möchte, der sich in Linux noch nicht so eingearbeitet hat (und vielleicht auch eine andere Distribution oder einen anderen Desktop nutzt, als man selbst).
 +
 +
Ein paar hilfreiche Befehle, so genannte ''Kommandzeilen-Befehle'', finden sich auf der [[Mini-HowTos]]-Seite.
 +
 +
Ein Script kann man eigentlich mit jedem Linux [https://de.wikipedia.org/wiki/Texteditor Textedior] wie z.B. <code>kate</code>, <code>gedit</code>, <code>vi</code>, <code>joe</code>, usw. erstellt werden. Wichtig ist, dass man anschließend Linux mitteilt, dass die Datei ausführbar sein soll. Das macht man mit dem Befehlt <code>chmod</code> und am einfachsten einfach mit dem Parameter <code>+x</code> als ausführbar (englisch e'''x'''ecuteable) markieren.
 +
 +
Linux benötigt außerdem entweder den absoluten Dateinamen oder das Script muss in einem ausführbaren Verzeichnis stehen, welches man mit <code>echo $PATH</code> anzeigen kann. Dabei werden die Pfade mit ':' getrennt. Normalerweise ist das aktuelle Verzeichnis bei Linux/Unix nicht ausführbar, weshalb man dann das Script mit <code>./</code> ausführen kann.
 +
 +
Beispiel Datei <code>xxx.sh</code>
 +
<pre>
 +
kate xxx.sh
 +
# => Startet den KDE Texteditor Kate, welcher die Datei 'xxx.sh' im aktuellen Verzeichnis anlegt, wenn man ihn nach dem Sichern verlässt.
 +
chmod +x xxx.sh
 +
# => macht die Datei 'xxx.sh' im aktuellen Verzeichnis ausführbar
 +
./xxx.sh
 +
# => führt die Datei 'xxx.sh' im aktuellen Verzeichnis aus
 +
</pre>
 +
 +
 +
'''Lizenz:'''
 +
Alle Scripte mit dem Vermerk [https://de.wikipedia.org/wiki/GPL GPL] ohne Version fallen unter die [https://www.gnu.de/documents/gpl-2.0.de.html GPL 2.0]. Siehe auch [[LugVSWiki:Copyright]] und Vermerk unten auf dieser Seite.
 +
 +
 +
===Anlegen von (mehreren) Ordnern / Dateien===
 +
Erstellt den Ordner „MeinOrdner“ im aktuellen Arbeitsverzeichnis.
 +
mkdir MeinOrdner
 +
Erstellt die beiden Ordner „MeinOrdner1“ und „MeinOrdner2“ im aktuellen Arbeitsverzeichnis
 +
mkdir MeinOrdner1 MeinOrdner2
 +
Erstellt folgende Ordner und Unterordner:<br>
 +
Ordner<br>
 +
├── A11<br>
 +
│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── AU1<br>
 +
│&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── AU2<br>
 +
└── A12<br>
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── AU1<br>
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── AU2
 +
mkdir -p Ordner/{A11,A12}/{AU1,AU2}
 +
Ordner mit fortlaufender Nummer anlegen im aktuellen Arbeitsverzeichnis:
 +
mkdir 202{0..9}
 +
Legt die Ordner 2020 bis 2029 an.
 +
 +
 +
=== BASH-Script um farblich markierte Ausgabe von DiskFree zu erstellen ===
 +
Ein kleine Script welche die Ausgabe des BASH Befehls DiskFree (df) in einer gut lesbaren Form anzeigt und Zeilenweise je nach Füllgrad in % die Farbe von default (grün) in gelb (Alarmpegel) und rot (kritischer Alarmpegel) jeder Zeile anpasst. Damit ist dann schon an der Farbe ersichtlich wenn eine Festplatte voll läuft. Aktuell kennt das Script noch keine Argumente, was ich aber demnächst evtl. noch mal anpasse. Download [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main/diskfree.sh diskfree.sh] @ [https://git.sp-codes.de/v/my-scripts git.sp-codes.de/Ulfi/my-scripts]
 +
<pre>
 +
#!/bin/bash
 +
#
 +
# df with some options and colored if Alert levels are exceeded
 +
# (c) GPL by Ulf Bartolomäus
 +
VERSION="Version 0.1.1  from 13.02.2021"
 +
 +
# 0.1.1
 +
# Initial based on whatch_new
 +
 +
MyDfC='df -hTx tmpfs -x devtmpfs' ## df - command - w/o *tenpfs
 +
MyDfCnN='df -hTx tmpfs -x devtmpfs -x fuse -x nfs4' ## df - command - w/o *tenpfs, fusa and nfs4
 +
#MyDfC="${MyDfCnN}" ## zweite Version statt erste
 +
MyDfAlert1=80                    ## alert level of df
 +
MyDfAlert2=90 ## critical alert level of df
 +
 +
## Escape seqences for color
 +
esc=$(echo -en "\033") ## define esc seqence
 +
dick="${esc}[1m" ## define bold seqence
 +
rot="${esc}[1;31m" ## define red seqence
 +
gruen="${esc}[1;32m" ## define green seqence
 +
gelb="${esc}[1;33m" ## define yelow seqence
 +
blau="${esc}[1;34m" ## define blue seqence
 +
lila="${esc}[1;35m" ## define purple seqence
 +
norm=$(echo -en "${esc}[m\017") ## define default seqence
 +
 +
## DiskFree (only if not the same device => uniq check first 40 characters
 +
${MyDfC} | uniq -w40 | while read MyOutput; do ## Execute df and filter doublicates - for each row stored in MyOutput
 +
MyDfUsage=$(echo ${MyOutput} | awk '{ print $6}' | cut -d'%' -f1 ) ## Search Usage in %
 +
    if [[ ! $( echo "${MyDfUsage}" | grep [[:digit:]] ) ]] ; then ## If first row
 +
        echo -e ${dick}"${MyOutput}"${norm} ## Echo in bold
 +
    elif [ $(( ${MyDfUsage} )) -ge ${MyDfAlert2} ]; then ## If critical level excided
 +
        echo -e ${rot}"${MyOutput}"${norm} ## Echo in red
 +
    elif [ $(( ${MyDfUsage} )) -ge ${MyDfAlert1} ]; then ## If alert level excided
 +
        echo -e ${gelb}"${MyOutput}"${norm} ## Echo in yelow
 +
    else ## default
 +
        echo -e ${gruen}"${MyOutput}"${norm} ## Echo in green
 +
    fi
 +
done
 +
</pre>
  
 
===BASH-Script: JPEG EXIF Text schreiben===
 
===BASH-Script: JPEG EXIF Text schreiben===
Ein bash-script welches ab dem Startverzeichnis, alle Unterverzeichnisse rekursiv nach einem Dateifilter (hier *.jpg) durchsucht. Auf alle gefundenen Dateien (keine Verzeichnisse) wird dann das Tool ''exiftran'' angewendet. Dieses überschreibt den Bildkommentar mit dem angegebenen Text. Achtung der bisher dort stehende Kommentar geht wirklich verloren, da er überschrieben wird. Damit es aber kein böses erwachen gibt, wird von jeder geänderten Datei eine Kopie mit der Endung ''<nowiki>~</nowiki>'' erstellt. Wenn man sich sicher ist, kann man natürlich die Option ''-b'' bei ''exiftran'' weglassen. Ich würde dieses nicht tun, sondern lieber bei bedarf die Sicherheitskopien mit ''rm -rf *~'' löschen.
 
  
Das Script wird auf der Kommandozeile mit dem Kommentartext als Parameter, am besten in Anführungszeichen, gestartet (nur wenn es in einem Verzeichnis aus PATH steht -> anzeige mit ''echo $PATH'', ansonsten muß natürlich der komplette Pfad mit angegeben werden): ''make_exif-name.sh "© Ulfi"''
+
Dieses ist ein BASH-script welches ab dem aktuellen Verzeichnis, alle Unterverzeichnisse rekursiv nach einem Dateifilter (hier *.jpg) durchsucht. Auf alle gefundenen Dateien (also keine Verzeichnisse die auf den Filter passen) wird dann das Tool ''exiftran'' angewendet. Dieses überschreibt den Bildkommentar mit dem angegebenen Text. Achtung der bisher dort stehende Kommentar geht wirklich verloren, da dieser überschrieben wird. Damit es aber kein böses Erwachen gibt, wird von jeder geänderten Datei eine Kopie mit der ''<nowiki>~</nowiki>'' am Ende erstellt (also aus ''<nowiki>xx.jpg</nowiki>'' wird ''<nowiki>xx.jpg~</nowiki>''). Wenn man sich sicher ist, dass man keine Kommentare überschreibt, kann man natürlich die Option ''-b'' bei ''exiftran'' weglassen und damit den Inhalt überschreiben. Das würde ich aber nicht empfehlen, sondern bei Bedarf lieber die Sicherheitskopien mit <code>rm -irf "*~"</code> löschen.
 +
 
 +
'''Achtung:''' Der Befehl <code>rm -rf *</code> löscht inklusive des aktuellen Verzeichnisses, alle Unterverzeichnisse und deren Dateien ohne weitere nachfrage. Deshalb muss der Stern (<nowiki>*</nowiki>) und die Tilde (<nowiki>~</nowiki>) immer direkt aneinander hängen und idealer weise auch noch mit dem Anführungszeichen (<nowiki>"</nowiki>) umschlossen werden, damit sie zu einem Suchfilter zusammen gefasst werden! Der Stern (<nowiki>*</nowiki>) ist auf der Kommandozeile ein Platzhalter für alle Zeichen in jeder beliebig häufigen Wiederholung! Sicherheitshalber habe ich mal den Prameter <code>-i</code> ergänzt der noch mal nachfragt (siehe auch [https://man7.org/linux/man-pages/man1/rm.1.html man rm]).
 +
 
 +
Das Script wird auf der Kommandozeile mit dem Kommentartext als Parameter, am besten in Anführungszeichen, gestartet (nur wenn es in einem Verzeichnis aus PATH steht -> Anzeige mit ''echo $PATH'', ansonsten muß natürlich der komplette Pfad mit angegeben werden): ''make_exif-name.sh "© Ulfi"''.
 +
 
 +
Alternativ kann man auch andere Tools zum lesen und schreiben von EXIF-Kommentaren verwenden. Folgende Befehle zeigen den EXIF-Kommentar an
 +
exiftool -a -u Bild.jpg | grep Comment
 +
convert Bild.jpg -format "%c\n" info:
 +
identify -verbose Bild.jpg | grep comment:
 +
Folgende Befehle schreiben den EXIF-Kommentar
 +
exiftran -ibp -c "Kommentar" Bild.jpg
 +
convert Bild.jpg -set comment "Kommentar" BildOut.jpg
 +
 
 +
Script mit Programm EXIFtran als Beispiel: (Download [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main/make_exif-name.sh make_exif-name.sh] @ [https://git.sp-codes.de/Ulfi/my-scripts git.sp-codes.de/Ulfi/my-scripts])
  
 
<pre>
 
<pre>
Zeile 17: Zeile 115:
 
#
 
#
 
# Changes:
 
# Changes:
# 0.0.2: comment as parameter from commandleine
+
# 0.0.2: comment as parameter from commandline
 
# 0.0.1: generation
 
# 0.0.1: generation
 
#
 
#
Zeile 40: Zeile 138:
 
</pre>
 
</pre>
  
 +
 +
=== BASH-Script: EXIF-Kommentar in Bild einblenden ===
 +
 +
Möchte man den EXIF-Kommentartext in die Bilder selber schreiben, um diese beim Betrachten jederzeit kenntlich zu haben, gibt es viele Möglichkeiten. Einige sind z.B. in ImageMagic Paket vorhanden und können dort vielfältig genutzt werden. Eine Übersicht der ImageMagic Möglichkeiten Text in Bilder zu Schreiben findet sich z.B. [https://imagemagick.org/Usage/annotating/ hier (in englisch)].
 +
 +
In Obigen script haben wir gelernt wie man EXIF-Kommentare in ein Bild Schreibt. In diesem script lesen wir diese wieder aus und schreiben sie in das Bild selbst, damit man es immer sehen kann. (Download [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main/write-exif-comment.sh write-exif-comment.sh] @ [https://git.sp-codes.de/Ulfi/my-scripts git.sp-codes.de/Ulfi/my-scripts])
 +
 +
<pre>
 +
#!/bin/bash
 +
# Write a exif-comment to all JPEG-Files from this directory and all subdirectorys
 +
#
 +
# (c) LUG-VS (GPL)
 +
VERSION="write-exif-comment.sh Version 0.0.1 from 16.06.2019"
 +
#
 +
# Input: InImage [OutImage]
 +
# Output: changed files
 +
#
 +
# Changes:
 +
# 0.0.1: generation
 +
#
 +
test -e $1 || exit -1
 +
FilenameFull="$1"
 +
if [ $# -gt 1 ] ; then
 +
    FilenameSik="$2"
 +
else
 +
    Extension="${FilenameFull##*.}"
 +
    FilenameBase="${FilenameFull%.*}"
 +
    FilenameSik="${FilenameBase}New.${Extension}"
 +
fi
 +
CommentsText="$(convert ${FilenameFull} -format "%c\n" info:)"
 +
Width=$(identify -format %w ${FilenameFull})
 +
High=$(( $(identify -format %h ${FilenameFull}) / 10))
 +
echo "EXIF-Kommentar= <${CommentsText}> of <${FilenameFull}> (${Width}x${High} ${FilenameSik})"
 +
convert -background '#0008' -fill white -gravity center -size ${Width}x${High} caption:"${CommentsText}" \
 +
          ${FilenameFull} +swap -gravity south -composite  ${FilenameSik}
 +
</pre>
  
  
 
===BASH-Script: Download von durchnummerierten Dateien===
 
===BASH-Script: Download von durchnummerierten Dateien===
Manchmal möchte man einige Dateien mit durchlaufender Nummer von z.B. ''01'' bis ''99'' (also mit führender Null) durchnummeriert ''downloaden'' oder in einem Script anders verarbeiten. Setzt man aber ein Bash-Variable direkt ein, so erhält man ''1'' statt ''01''. Im nachfolgenden Skript habe ich mal sowas umgesetzt (ich möchte nicht ausschließen das es auch einen eleganteren Weg gibt).
 
  
Das Skript selber ist eigentlich recht simpel. Zunächst werden einige Variablen vorbelegt. Im Beispiel wird z.B. ein Proxy gesetzt, z.B. um einen Werbeblocker oder einen Anonymisierungsdienst zwischen zu schalten. Anschließend wird in das Zielverzeichnis gewechselt. Nun startet eine ''for''-Schleife welche die Variable ''NR'' hochzählt. Innerhalb der Schleife wird dann mit Hilfe einer arithmetischen Operation zunächst die Einer und Zehner Werte ermittelt. In der Bash wird eine arithmetischen Operation mit einem ''$'' eingeleitet und innerhalb einer doppelten runden Klammer eingefasst  z.B. ''$((567 / 10))''. Diese ersetzt dann die Berechnung durch das Ergebnis, im Beispiel wird also ''$((567 / 10))'' durch ''56'' ersetzt (also eine Integerzahl oder ganze Zahl). Sind nun die Zehnerpotenzen separiert, so können Sie wie im Beispiel mit dem Download Tool ''wget'' verwendet werden. Dieses lädt die Datei (notfalls auch in mehreren Versuchen) über den Proxy ins lokale Verzeichnis. Sind alle Dateien geladen, wird die Schleife beendet und wieder zurück in das ursprüngliche Verzeichnis gewechselt. Ganz zum Schluss wird noch mal kurz mit dem Befehl ''beep'' Gehupt.
+
Manchmal möchte man einige Dateien mit durchlaufender Nummer von z.B. ''01'' bis ''99'' (also mit führender Null) durchnummeriert ''downloaden'' oder in einem Script anders verarbeiten. Setzt man aber ein Bash-Variable direkt ein, so erhält man ''1'' statt ''01''. Im nachfolgenden Script habe ich mal sowas umgesetzt (ich möchte nicht ausschließen das es auch einen eleganteren Weg gibt).
 +
 
 +
Das Script selber ist eigentlich recht simpel. Zunächst werden einige Variablen vorbelegt. Im Beispiel wird z.B. ein Proxy gesetzt, z.B. um einen Werbeblocker oder einen Anonymisierungsdienst dazwischen zu schalten. Anschließend wird in das Zielverzeichnis gewechselt. Nun startet eine ''for''-Schleife welche die Variable ''NR'' hochzählt. Innerhalb der Schleife werden dann mit Hilfe einer arithmetischen Operation zunächst die Einer- und Zehner-Werte ermittelt. In der Bash wird eine arithmetischen Operation mit einem ''$'' eingeleitet und innerhalb einer doppelten runden Klammer eingefasst  z.B. ''$((567 / 10))''. Diese ersetzt dann die Berechnung durch das Ergebnis, im Beispiel wird also ''$((567 / 10))'' durch ''56'' ersetzt (also eine Integerzahl oder ganze Zahl). Sind nun die Zehnerpotenzen separiert, so können sie wie im Beispiel mit dem Download Tool ''wget'' verwendet werden. Dieses lädt die Datei (notfalls auch in mehreren Versuchen) über den Proxy ins lokale Verzeichnis. Sind alle Dateien geladen, wird die Schleife beendet und wieder zurück in das ursprüngliche Verzeichnis gewechselt.
  
 
<pre>
 
<pre>
Zeile 51: Zeile 186:
 
# (c) LUG-VS (GPL)
 
# (c) LUG-VS (GPL)
 
# Set Variables
 
# Set Variables
export http_proxy=http://proxy.homenetz.de:1234/                # Set an Proxy
+
export http_proxy=https://proxy.homenetz.de:1234/                # Set an Proxy
 
# Change to destination path
 
# Change to destination path
 
cd ${HOME}/MyDestinationPath
 
cd ${HOME}/MyDestinationPath
Zeile 70: Zeile 205:
 
# Go back in the last path
 
# Go back in the last path
 
cd -
 
cd -
# Make a short beep to sign that the download is ready
 
beep
 
 
</pre>
 
</pre>
 +
 +
 +
====Anmerkung/Update====
 +
 +
Einfacher kann man mit folgender Funktion <code>pad</code> aus dem [https://forum.ubuntuusers.de/topic/bash-variablengenerierung-mit-fuehrenden-nulle/ UbuntuUsers Forum] führende Zeichen ergänzen. Die dort verwendeten Stringoperatoren (die Zahlen nach dem Doppelpunkt) sind z.B. im Linux User Artikel [https://www.linux-community.de/ausgaben/linuxuser/2001/02/teil-3-string-verarbeitung-und-regulaere-ausdruecke/ Teil 3: String-Verarbeitung und Reguläre Ausdrücke] erklärt. Nachfolgend ein kleines Script welches die pad funktion benutzt und sie z.B. als <code>pad.sh</code> zur Verfügung stellt.
 +
 +
<pre>
 +
#!/bin/bash
 +
# Script zum füllen von
 +
# https://forum.ubuntuusers.de/topic/bash-variablengenerierung-mit-fuehrenden-nulle/
 +
 +
pad() {
 +
        local s=$1 c=${2:-0} p=${3:- }
 +
        while [ ${#s} -lt $c ] ; do s="${p:0:$c - ${#s}}$s" ; done
 +
        echo "$s"
 +
}
 +
 +
#pad 1 3
 +
# -> "  1"
 +
 +
#pad 123 5 0
 +
# -> "00123"
 +
 +
#pad xyz 5 abc
 +
# -> "abxyz"
 +
 +
 +
if [ $# -eq 3 ] ; then
 +
        pad $1 $2 $3
 +
else if [ $# -eq 2 ] ; then
 +
        pad $1 $2
 +
else
 +
        echo -e "\n*** Error 255: wrong number of Parameter - use $0 <value> <no digits> [fill character]\n" 1>&2
 +
        exit 255
 +
fi fi
 +
</pre>
 +
 +
  
 
===BASH-Skript: konvertiert Textdateien in utf8 CharSet===
 
===BASH-Skript: konvertiert Textdateien in utf8 CharSet===
Das nachfolgendes Skript konvertiert eine Textdatei von einem anderen Zeichensatz (CharSet) in den Unicode (utf8). Dabei versucht es selbstständig den vorherigen Zeichensatz herauszufinden. Um Datenverlust zu vermeiden wird die Datei zuerst in eine Sicherheitskopie umbenannt (mit der "~" =Tilde als letztes Zeichen, wie das viele UNIX Editoren auch machen). Anschließend wird diese dann das bearbeitete (konvertierte) Ergebnis in den Original Dateinamen zurück geschrieben. Anschließend muss man dann selber prüfen ob man mit dem Ergebnis zufrieden ist. Ansonsten kann man das Ergebnis ja löschen und die Datei wieder zurück umbenennen.
+
 
 +
Das nachfolgendes Skript konvertiert eine Textdatei von einem anderen Zeichensatz (CharSet) in den Unicode (utf8). Dabei versucht es selbstständig den vorherigen Zeichensatz herauszufinden. Um Datenverlust zu vermeiden wird die Datei zuerst in eine Sicherheitskopie umbenannt (mit der "~" =Tilde als letztes Zeichen, wie das viele UNIX Editoren auch machen). Hat das Skript die Konvertierung abgeschlossen, schreibt es das bearbeitete (konvertierte) Ergebnis in den Original-Dateinamen zurück. Allerdings muss man dann selbst prüfen, ob man mit dem Ergebnis der Bearbeitung zufrieden ist. Ansonsten kann man das Ergebnis ja löschen und die Datei wieder mit dem vorherigen Namen benennen. (Download [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main/utf8.sh utf8.sh] @ [https://git.sp-codes.de/Ulfi/my-scripts git.sp-codes.de/Ulfi/my-scripts])
  
 
<pre>
 
<pre>
Zeile 111: Zeile 283:
 
fi
 
fi
 
</pre>
 
</pre>
 +
 +
  
 
===BASH-Skript: konvertiert Dateien von z.B. WMF in z.B. SVG===
 
===BASH-Skript: konvertiert Dateien von z.B. WMF in z.B. SVG===
Ab und zu sollte man Dateien die in irgend einem Grafikformat vorliegen in ein anderes konvertieren. Dieses gelingt mit den Programm ''convert'' aus dem [http://www.imagemagick.org ImageMagick®] Paket recht einfach. Eine Liste der unterstützten Formate findet man auf der ImageMagick® Seite mit den unterstützten [http://www.imagemagick.org/script/formats.php Formaten]. Dieses Skript definiert am Anfang das Quellenformat in der Variablen ''FORMATin'' und das Ausgabeformat in der Variablen ''FORMATout''. Durch anpassen der entsprechenden Datei-Enden aus der [http://www.imagemagick.org/script/formats.php Formatliste] von ImageMagick® sollte man einen beliebigen Konverter bauen können. In den Zeilen welche zwischen ''echo -e'' und ''>> `echo ${TEMPfile}`'' das eigentliche Bearbeitungs-Skript generieren, können natürlich beliebige Ergänzungen eingebracht werden. '''Aber Achtung, man kann hier natürlich auch sehr viel falsch machen'''. Deshalb sollte man zunächst neue Befehle mit einem ''echo'' davor zunächst mal ansehen, bevor man sie dann durch das entfernen von ''echo'' tatsächlich verwendet. Auch ein temporäres Verzeichnis mit kopierten Beispieldateien kann ganz hilfreich sein.
 
  
Benutzt wird das Skript nachdem man die nachfolgenden Zeilen in eine Datei kopiert (z.B. durch öffnen von Kate im Zielpfad auf der Kommandozeile bzw. im Terminal (mit ''kate wmf2svg.sh''), copy & paste des nachfolgenden Skripts in die leere Datei, abspeichern und anschließenden ausführbar machen der generierten Datei (mit ''chmod +x wmf2svg.sh'')). Aufgerufen ohne Parameter konvertiert das Skript alle Dateien im ''FORMATin'' (bzw. des dort angegebenen Dateityp/-endung) aus dem aktuellen Verzeichnis und allen Unterverzeichnissen, in das Ausgabeformat ''FORMATout'' (bzw. des dort angegebenen Dateityp/-endung). Als Parameter kann man aber auch den Pfad direkt angeben, von dem aus das Skript alle Dateien sowie diejenigen aus den Unterverzeichnissen konvertiert.
+
Ab und zu möchte man Dateien, welche in irgend einem Grafikformat vorliegen, in ein anderes konvertieren. Dieses gelingt mit den Programm ''convert'' aus dem [https://www.imagemagick.org ImageMagick®] Paket recht einfach. Eine Liste der unterstützten Formate findet man auf dieser Seite: ''https://www.imagemagick.org/script/formats.php''. Dieses Skript definiert am Anfang das Quellformat in der Variablen ''FORMATin'' und das Ausgabeformat in der Variablen ''FORMATout''. Durch Anpassen der entsprechenden Datei-Enden aus der [https://www.imagemagick.org/script/formats.php Formatliste] von ImageMagick® sollte man einen beliebigen Konverter bauen können. In den Zeilen welche zwischen ''echo -e'' und ''>> `echo ${TEMPfile}`'' das eigentliche Bearbeitungs-Skript generieren, können natürlich beliebige Ergänzungen eingebracht werden. '''Aber Achtung, man kann hier natürlich auch sehr viel falsch machen'''. Deshalb sollte man zunächst neue Befehle mit einem ''echo'' davor zunächst mal ansehen, bevor man sie dann durch das Entfernen von ''echo'' tatsächlich verwendet. Auch ein temporäres Verzeichnis mit kopierten Beispieldateien kann ganz hilfreich sein.
 +
 
 +
Benutzt wird das Skript, nachdem man die nachfolgenden Zeilen in eine Datei kopiert. Man öffnet es zum Beispiel mit dem Programm Kate im Zielpfad auf der Kommandozeile, bzw. im Terminal mit ''kate wmf2sfg.sh''. Dann wird das Skript per copy & paste (Kopieren und Einfügen = Strg+C und danach Strg+V) in der leeren Datei abgespeichert. Die erzeugte Datei ''wmf2sfg.sh'' wird nun noch ausführbar gemacht - z. B. im Terminal mit ''chmod +x wmf2svg.sh''. Das geht bei den meisten Distros aber auch grafisch im jeweiligen Dateimanager, indem man mit einem Rechtsklick auf die Datei in das Menü ''Eigenschaften'' gelangt und danach einen Haken im Feld ''Ausführbar'' (unter dem Reiter ''Berechtigungen'') setzt. Aufgerufen ohne Parameter konvertiert das Skript alle Dateien mit ''FORMATin'' (bzw. des dort angegebenen Dateityps, bzw. der Dateiendung) aus dem aktuellen Verzeichnis und allen Unterverzeichnissen, in das Ausgabeformat ''FORMATout'' (bzw. des dort angegebenen Dateityps, bzw. der Dateiendung). Als Parameter kann man aber auch den Pfad direkt angeben, von dem aus das Skript alle Dateien, sowie diejenigen aus den Unterverzeichnissen konvertiert. (Download [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main/wmf2svg.sh wmf2svg.sh] @ [https://git.sp-codes.de/Ulfi/my-scripts git.sp-codes.de/Ulfi/my-scripts])
  
 
<pre>
 
<pre>
Zeile 177: Zeile 352:
 
rm ${TEMPfile}
 
rm ${TEMPfile}
 
</pre>
 
</pre>
 +
 +
  
 
===BASH-Skript: Festplatte sicher löschen===
 
===BASH-Skript: Festplatte sicher löschen===
 +
 +
Alternativ: [https://sourceforge.net/projects/dc3dd/ dc3dd]
 +
 
Vielleicht haben Sie schon mal darüber nachgedacht eine Festplatte weiterzugeben, z. B. bei Ebay zu verkaufen. Damit auf diesem Weg nicht auch Ihre persönlichen Daten unbeabsichtigt weiter gegeben werden, sollten Sie deshalb diese Festplatte löschen. Das ist der Sinn dieses Skriptes: es überschreibt die Festplatte in zwei Schritten. Zuerst werden Zufallszahlen auf die gesamte Platte geschrieben und anschließend komplett mit Nullen gefüllt. So können die Daten nicht ohne erheblichen technischen Aufwand wiederhergestellt werden. Für Laien und ambitionierte Hobbytüftler also sicher. Aber Achtung! Bei aktuell recht großen Platten ab mehrere hundert GB, kann das Löschen auch schon mal einen Tag lang gehen! <b>Anmerkung: Die Festplatte sollte entweder zusätzlich in den PC eingebaut sein oder mit Hilfe eines USB- oder eSATA-Anschlusses mit dem PC verbunden werden, damit das funktioniert. Es ist keine gute Idee das mit der /dev/sda1 bzw. /dev/hda1 eines laufenden GNU/LINUX-Systems zu machen!</b>
 
Vielleicht haben Sie schon mal darüber nachgedacht eine Festplatte weiterzugeben, z. B. bei Ebay zu verkaufen. Damit auf diesem Weg nicht auch Ihre persönlichen Daten unbeabsichtigt weiter gegeben werden, sollten Sie deshalb diese Festplatte löschen. Das ist der Sinn dieses Skriptes: es überschreibt die Festplatte in zwei Schritten. Zuerst werden Zufallszahlen auf die gesamte Platte geschrieben und anschließend komplett mit Nullen gefüllt. So können die Daten nicht ohne erheblichen technischen Aufwand wiederhergestellt werden. Für Laien und ambitionierte Hobbytüftler also sicher. Aber Achtung! Bei aktuell recht großen Platten ab mehrere hundert GB, kann das Löschen auch schon mal einen Tag lang gehen! <b>Anmerkung: Die Festplatte sollte entweder zusätzlich in den PC eingebaut sein oder mit Hilfe eines USB- oder eSATA-Anschlusses mit dem PC verbunden werden, damit das funktioniert. Es ist keine gute Idee das mit der /dev/sda1 bzw. /dev/hda1 eines laufenden GNU/LINUX-Systems zu machen!</b>
 +
 +
Es geht aber auch, wenn man dieses Skript auf einen USB-Stick speichert und z. B. ein Live-LINUX von CD / DVD startet und das Skript von dort aus vom USB-Stick aufruft, wenn man z. B. einen Laptop verkaufen möchte ohne die Festplatte zuvor umständlich aus- und wieder einzubauen.
 +
 +
<b>TIPP:</b> Der Aufruf des Skriptes funktioniert nur, wenn man dem Skript als Variable den Pfad zur Festplatte (Device) angibt:
 +
 +
[Skriptname] /dev/sdX
 +
 +
Dabei ist der Name des Skriptes frei wählbar. Ich nenne es z. B. ''SchredderHDD.sh''. Der Pfad zur Festplatte richtet sich nach der Festplatte selbst. Also /dev/sda für die erste, /dev/sdb für die zweite, /dev/sdc für die dritte Festplatte im Gerät u.s.w. ''Aber '''ACHTUNG!''' Wer sich nicht absolut sicher ist, das Richtige zu tun, sollte besser jemanden fragen, der sich damit auskennt.'' <b>Ansonsten bitte die Finger davon lassen!</b> Unwiederbringlich gelöschte Daten sind eben für immer gelöscht! Es darf normalerweise auf den PC keine noch benötigte Platte angeschlossen sein - nur das CD/DVD Laufwerk bzw. der USB Stick (idealerweise schreibgeschützt). Ansonsten löscht man aus Versehen seine noch benötigte Platte!'' [[Medium:SchredderHDD.sh|SchredderHDD.sh downloaden]]
  
 
<pre>
 
<pre>
Zeile 240: Zeile 428:
 
</pre>
 
</pre>
  
=== BASH Skript: Stellt sicher das Namen aus Datei als Verzeichnis angelegt sind ===
+
=== BASH Skript: Stellt sicher, dass Namen aus einer Datei als Verzeichnis angelegt sind ===
 +
 
 
Dieses Skript hat unser Mitglied Gerhard für seine Auftragsbearbeitung erstellt und uns als GPL zur Verfügung gestellt. Danke dafür an Ihn!
 
Dieses Skript hat unser Mitglied Gerhard für seine Auftragsbearbeitung erstellt und uns als GPL zur Verfügung gestellt. Danke dafür an Ihn!
  
Dieses Script liest Zeilenweise die Date '''EingabeDatei.txt''' in der Aufträge in der Art '''YYANR-Name''' abgelegt sind. Dabei entspricht '''YY''' dem Jahr, '''ANR''' der dreistelligen Auftragsnummer und '''Name''' dem Namen des Auftrags. Diese werden nach Jahren sortiert als Unterordner angelegt, falls noch nicht vorhanden. Dabei sollten auch ähnliche Einträge die schon manuell angelegt wurden erkannt werden und nicht erneut angelegt werden.
+
Dieses Skript liest zeilenweise Daten im Format '''EingabeDatei.txt''', in welchen Aufträge in der Formatierung '''YYANR-Name''' abgelegt sind. Dabei entspricht '''YY''' dem Jahr, '''ANR''' der dreistelligen Auftragsnummer und '''Name''' dem Namen des Auftrags. Diese Daten werden nach Jahren sortiert und - falls noch nicht vorhanden - als Unterordner neu angelegt. Dabei sollten auch ähnliche Einträge, die schon manuell angelegt wurden, erkannt werden und damit nicht erneut erzeugt werden.
  
 
<pre>
 
<pre>
Zeile 264: Zeile 453:
 
</pre>
 
</pre>
  
==Links BASH Programmierung==
 
Noch ein paar Links, wo man weitere Informationen zur BASH Programmierung findet.
 
  
* Einführung in die BASH auf [http://selflinux.org/selflinux/html/bash_basic.html selfLinux.org]
 
* Bedienung der BASH auf [http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2003/03/Konfiguration-der-Bash Linux-Community.de]
 
* Einführung in die BASH-Programmierung auf [http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2005/02/Einfuehrung-in-die-Bash-Programmierung Linux-Community.de]
 
* Einführung in die BASH auf [http://www.bin-bash.de/ bin-bash.de] dem Treffpunkt für Linux-Shelluser
 
  
==Sonstige nützliche Scripte aus dem Internet==
 
  
===Umbenennen von Dateien mit Sonderzeichen in ASCII konforme Namen===
+
=== BASH Skript: DynDNS update durchführen ===
[http://pastebin.com/1BYbnzuy chnames.sh] (bzw. auch [https://github.com/neontribe/Shell-tools/blob/master/chnames.sh unter]) von [mailto:conny@supple-pixels.net Conny Faber] ist ein BASH Script zum umbenennen von Dateinamen in eine ASCII basierte Version ohne Sonderzeichen.  
+
 
 +
Dieses Skript hat unser Mitglied Gerhard für seine Auftragsbearbeitung erstellt und uns als GPL zur Verfügung gestellt. Danke dafür an Ihn!
 +
 
 +
Dieses script überprüft, ob die in der Datei <code>/tmp/myip.txt</code> zwischengespeicherte IP Adresse des Routers aus dem Internet, mit der aktuellen (via <code>o-o.myaddr.l.google.com</code> dienst) übereinstimmt. Wenn nicht, wird die neue Adresse in die Datei geschrieben und anschließend mit einem Link die Adresse auf dem DynDNS Server aktualisiert.
 +
 
 +
Da diese Überprüfung in regelmäßigen Abständen erfolgen sollte, kann man dazu den Linux [https://de.wikipedia.org/wiki/Cron cron] Dienst benutzen. Dieser überprüft jede minute, ob eine Zeile innerhalb der config Datei (früher war das <code>/etc/crontab</code>, welches aber nicht mehr benutzt werden sollte), wird in den ersten fünf mit Leerstelle oder Tab getrennten Zeitangaben geprüft, bis eine mit der aktuellen Uhrzeit übereinstimmt. Ist dieses der Fall, wird der Befehl hinter der Zeitangabe ausgeführt. Die Datei bearbeitet man als "root" Benutzer mit <code>crontab -e</code> oder als normaler Benutzer mit <code>sudo crontab -e</code>. Dort schreibt man dann die folgenden Zeilen hinein (wobei man die mit der <code>#</code> beginnenden Zeilen auch weglassen kann, da diese nur Kommentare für den Bediener sind.
 +
 
 +
 
 +
<pre>
 +
# crontab Datei - Zeit/Datums Format:                                                                                                                                                                         
 +
# mn hr dm mt dw                                                                                                                                                                       
 +
# mn              minute        0-59                                                                                                                                                 
 +
#    hr            hour          0-23                                                                                                                                                 
 +
#      dm        day of month  1-31                                                                                                                                                 
 +
#          mt      month          1-12 (or names, see below)                                                                                                                           
 +
#            dw  day of week    0-7 (0 or 7 is Sun, or use names)                                                                                                                    
 +
# Wenn der Wert keine Rolle spielen soll - wird ein * für die aktuelle Zeit verwendet
 +
 
 +
# Nachfolgendes Script alle 10 Minuten aufrufen (aktuelle Zeit geteilt durch 10)                                                                                                                                                                                     
 +
*/10 * * * *    /root/bin/DynDNSupdate.sh &>> /dev/null
 +
</pre>
  
  
In der aktuellen Version werden keine Verzeichnisnahmen umbenannt - dieses ist noch auf der ToDo Liste. Eine geringfügig überarbeitete Version des Originals ist unten zu sehen und kann alternativ herunter geladen werden: [[Datei:Chnames.sh]]
+
Nachfolgend das Script das idealer weise unter dem Namen <code>/root/bin/DynDNSupdate.sh</code> als Benutzer "root" gespeichert werden sollte (also man muss sich erst mit root anmelden (z.B. mit <code>sudo su</code>).
  
  
 
<pre>
 
<pre>
 
#!/bin/bash
 
#!/bin/bash
 +
## meine ip herausfinden
 +
myip="$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}')";
 +
# Alternativ (Kommentar # for nächster Zeile entfernen)
 +
#myip="$(dig +short myip.opendns.com @resolver1.opendns.com)";
 +
 +
## welche IP war zuvor
 +
while read LINE
 +
do
 +
  alt_ip=$LINE
 +
done < /tmp/myip.txt
 +
 +
## echo Aktuell: $myip Alt: $alt_ip
 +
## sind die IPs gleich?
 +
if [ $myip = $alt_ip ]
 +
then
 +
  echo ist gleich >> /tmp/myiplog.txt
 +
else
 +
  echo $myip > /tmp/myip.txt;
 +
  echo ist anders >> /tmp/myiplog.txt
 +
  curl "http[s]://<hier kommt deine update-query rein>"
 +
fi
 +
</pre>
 +
 +
 +
 +
 +
=== BASH Skript: Führt ein komfortables und inkrementelles Backup/Restore aus ===
 +
 +
Diese Skript benutzt mit [https://de.wikipedia.org/wiki/Zenity Zenity] eine graphische Schnittstelle mit der der User einfach und komfortabel Backup/Restore machen kann. Die Ereignisse werden in einer Log-Datei <code>/tmp/backup-restore-de.log</code> erfasst, da für den Ordner <code>/var/log</code> <code>root</code> Zugangsrechte nötig sind.
 +
  
# chnames.sh - Dateinamen ändern durch Ersetzen unliebsamer Zeichen.
+
<pre>
 +
#!/bin/bash -x           
 +
#--> "-x"-Befehle und ihre Argumente während der Ausführung ausgeben
 +
# (c) LUG-VS (GPL)
 
#
 
#
# Ursprüngliche Version:
+
# Beschreibung:            Führt ein komfortables und inkrementelles Backup aus.
# Copyright (C) 2005-2007 Conny Faber <conny@supple-pixels.net>
+
# Zusätzliche Pakete:       Zenity-Library 
# Die neueste Version, ein kleines Archiv mit sonderbaren und dennnoch
+
# Skript-Name:              backup&restore-de.bash
# möglichen Dateinamen und die englische Version dieses Skripts sind zu
+
# Version:                  vom 15.01.2017 (Deutsch)
# finden unter http://www.supple-pixels.net.
+
# Bemerkung:                Bei Dateiname oder Ordnername
 +
#                          darf kein Leerezeichen dazwischen sein
 +
#                          Nur mit Runlevel 5 bzw. xorg ausführbar und
 +
#                           root-Zugriffrechte erforderlich
 +
# Autor:                   Giorgio Giuseppe Codardo (giuseppe.codardo@googlemail.com
 +
#===========================================================================
 +
# Deklaration, Definition und Initialisierung von Variablen.
 +
SOURCE=' '
 +
DESTINATION=' '
 +
typeset -i OPERATION=0
 +
RESULT=' '
 +
typeset -i BYTES=0
 +
DATE=$(date +%d.%m.%Y)
 +
TIME=$(date +%H:%M)
 +
#==========================================================================
 
#
 
#
# Heutige Version (ab 1.9.0)
+
echo $PATH
# Angepasst von der LUG-VS.de (siehe Versionsbeschreibung)
 
 
#
 
#
# Dieses Programm ist freie Software. Es kann unter den Bedingungen der GNU
+
function verify_exit_status
# General Public License, wie von der Free Software Foundation herausgegeben,
+
{
# weitergegeben und/oder modifiziert werden, gemäß Version 2 der Lizenz.
+
  if [ $? -ne 0 ];
 +
  then zenity --error \
 +
              --text="Es ist ein Fehler aufgetreten, deshalb wird dieses Script unterbrochen:\n
 +
                      - Bitte mit anderen Parametern neu starten, \n
 +
                      - oder Debugging verwenden um den Fehler zu suchen."
 +
  exit             
 +
  fi
 +
}
 +
#
 +
#
 +
#==========================================================================
 +
function start_backup
 +
{
 +
SOURCE=$(zenity --file-selection \
 +
                --multiple \
 +
                --directory \
 +
                --title="Quelleverzeichnis wählen ...")
 
#
 
#
# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es
+
# '|' von Zenity wird ' 'ersetzt, so das man in der Kommandozeile für
# von Nutzen sein wird, aber OHNE JEDE GARANTIE, noch nicht einmal der der
+
# cp benutzen kann.
# VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details sind zu finden in der
 
# Datei GNU General Public License (siehe Datei COPYING).
 
 
#
 
#
+
SOURCE=${SOURCE//|/' '}
# Dieses Skript habe ich v.a. zur Umbenennung von MP3-Dateien geschrieben,
+
#
# die oft nicht nur Umlaute enthalten (Problem zwischen verschiedenen
+
zenity --warning \
# Kodierungen), sondern auch noch diverse andere Zeichen wie Klammern, +, &,
+
      --text="                WICHTIG! \n
# Leerzeichen (ungünstig für einige Programme) etc.; aber auch andere Dateien
+
                - Externe Festplatte mounten,\n
# lassen sich mit chnames.sh automatisch prüfen und umbenennen.
+
                - Bei Home-Verzeichnis: Verlauf löschen und \n
 +
                - Papierkorb leeren, \n
 +
                - Sicherstellen, dass das Dateisystem kompatibel ist."
 +
#
 +
DESTINATION=$(zenity --file-selection \
 +
                    --directory \
 +
                    --title="Zielverzeichnis wählen ...")
 +
#
 +
verify_exit_status
 +
#
 +
# Startet ein inkrementelles Backup
 +
#
 +
cp --archive --update $SOURCE $DESTINATION |
 +
zenity --progress \
 +
      --title="Backup wird ausgeführt" \
 +
      --width=400 --height=200 \
 +
      --text="Bitte warten ..." \
 +
      --pulsate \
 +
      --auto-close
 +
#
 +
# Hier werden die Bytes ermittelt, die kopiert wurden und
 +
# der Pfad entfernt.
 +
#
 +
RESULT=$(du -bs $SOURCE)
 +
RESULT=${RESULT/'/'/'_'}
 +
BYTES=${RESULT%_*}
 
#
 
#
# chnames.sh läßt sich nur UTF-8-kodiert in UTF-8-Shell verwenden, da das Skript
+
zenity --info \
# selbst Zeichen enthält, die außerhalb des ISO-8859-1-Bereiches liegen!
+
      --text="BACKUP erfolgreich ausgeführt!\n
 +
              Es wurden $BYTES Bytes kopiert/aktualisiert.\n
 +
              Weitere Infos: /tmp/backup-restore-de.log"
 +
}
 +
# End function start_backup
 +
#
 +
#==========================================================================
 
#
 
#
# ToDo - later:
+
function start_restore
# -------------
+
{     
# -k = keep = mehrfache Vorkommen, z.B. --- ___ behalten
+
zenity --warning \
# -s = substitute = eigene Ersetzungsformen angeben, z.B.
+
      --text="                WICHTIG! \n
#      -s '+|plus' -s '. |.'  (= -s [von|nach])
+
                - Externe Festplatte mounten,\n
# -p = rename also phat names = auch Verzeichnisnamen mit umbenennen
+
                - Sicherstellen, dass das Dateisystem kompatibel ist."
 
#
 
#
# Version
+
SOURCE=$(zenity --file-selection \
# 1.9.0 Update durch LUG-VS.de
+
                --multiple \
# Lizenz geändert auf GPL v2 only
+
                --directory \
# (da es teilweise noch Probleme mit v3 gibt)
+
                --title="Quelleverzeichnis wählen ...")
# ToDo erweitert
 
# VERSION - angepasst
 
  
+
verify_exit_status
benutzung()
+
#
{
+
SOURCE=${SOURCE//|/' '}
HILFE="chnames.sh - Umbenennen von Datei- und Verzeichnisnamen
+
#
+
#
Beschreibung:
+
DESTINATION=$(zenity --file-selection \
-------------
+
                    --directory \
chnames.sh ist ein Shell-Skript, das v.a. zur Umbenennung von MP3-Dateien
+
                     --title="Zielverzeichnis wählen ...")
entwickelt wurde, da diese oft Leerzeichen, Umlaute, Klammern und andere
+
#
unliebsame Zeichen enthalten. Es lassen sich per chnames.sh Dateien und
+
verify_exit_status
Verzeichnisse umbenennen, indem automatisch folgende Ersetzungen vorgenom-
+
#
men werden:
+
cp --recursive --force $SOURCE $DESTINATION |  
+
zenity --progress \
(Hinweis: Um alle unten aufgeführten Zeichen sehen zu können, wird ein
+
      --title="Wiederherstellung wird ausgeführt" \
          Terminal benötigt, das UTF-8-Zeichen richtig anzeigen kann, z.B.
+
      --width=400 --height=200 \
          urxvt, gnome-terminal, konsole.)
+
      --text="Bitte warten ..." \
+
      --pulsate \
Zeichen                            Wird zu
+
      --auto-close
---------------------------------------------------------------------------
+
#
Klammern: () [] {} <>              -
+
RESULT=$(du -bs $SOURCE)
Leerzeichen                        _
+
RESULT=${RESULT/'/'/'_'}
Ä Ö Ü ä ö ü ß                      Ae Oe Ue ae oe ue ss
+
BYTES=${RESULT%_*}
+ &                                _and_ bzw. _und_ (je nach Sprachwahl)
+
#
°                                  _deg_ bzw. _Grad_ (je nach Sprachwahl)
+
zenity --info \
: ;                                .
+
       --text="WIEDERHERSTELLUNG erfolgreich ausgeführt !\n
,                                  gefolgt von Leerzeichen: _
+
              Es wurden $BYTES Bytes wiederhergestellt.\n
                                    sonst:                  .
+
              Weitere Infos: /tmp/backup-restore-de.log"
' \" \` ´ ? ! ^ # * ¿ ¡ ,            Werden entfernt.
 
Akzentzeichen                     Werden zu Zeichen ohne Akzent:
 
                                    ÀÁÂÃÅ - A        àáâãå - a
 
                                    Æ    - AE      æ    - ae
 
                                    ÇĆĈĊČ - C        çćĉċč - c
 
                                    ÈÉÊË  - E        èéêë  - e
 
                                    ÌÍÎÏ  - I        ìíîï  - i
 
                                    Ñ    - N        ñ    - n
 
                                    ÒÓÔÕØ - O        òóôõø - o
 
                                    ŚŜŞŠ  - S        śŝşš  - s
 
                                    ÙÚÛ  - U        ùúû  - u
 
                                    Ý    - Y        ýÿ    - y
 
                                    ŹŻŽ  - Z        źżž  - z
 
mehrere Leerzeichen - _ . ~        Werden auf 1 Zeichen reduziert.
 
- am Namensanfang                  Wird entfernt.
 
 
 
Benutzung: chnames.sh <-d [dir]> <-D> <-g> <-r> <--check|--echeck|--no-log|-u>
 
---------  chnames.sh <-f [datei]>... <-g> <--check|--echeck>
 
          chnames.sh <-h|--usage|--version>
 
 
 
--check      Reiner Test: Tut so, als würde umbenannt werden. Ausgabe von
 
              Original und potentiell zu verändernden Namen auf der Shell.
 
              Es werden keine Namen verändert und keine Log-Datei angelegt.
 
-d [dir]      Verzeichnis angeben, in dem umbenannt werden soll.
 
              (Default = aktuelles Verzeichnis)
 
-D            Benennt Verzeichnisse um, nicht Dateien.
 
--echeck      Extra-Check: Reine Überprüfung, ob Datei- oder Verzeichnis-
 
              namen Zeichen außerhalb des ASCII-Bereichs enthalten. Erlaubt
 
              sind die Zeichen 0-9, A-Z, a-z sowie - _ . und ~. Ausgabe der
 
              Liste gefundener Namen erfolgt auf der Shell. Beim Extra-Check
 
              werden keine Namen verändert. Hiermit kann z.B. nach dem Um-
 
              benennen per chnames.sh geprüft werden, ob noch Namen übrig
 
              sind, die per chnames.sh nicht berücksichtigte Akzentzeichen,
 
              oder andere Sonderzeichen enthalten.
 
-f [file]    Einzelne Datei- oder Verzeichnisnamen zur Ersetzung übergeben.
 
              Jeder Datei bzw. jedem Verzeichnis muss -f vorangestellt wer-
 
              den.
 
              Beachte: Hier wird der Umbenennungsvorgang nur in der Shell
 
                        ausgegeben. Es wird keine Log-Datei und kein Undo-
 
                        Skript angelegt.
 
-g            Sprache Deutsch für Ersetzungen festlegen:
 
              - \"&\" und \"+\" werden zu \"_und_\" (default: \"_and_\")
 
              - \"°\" wird zu \"_Grad_\" (default: \"_deg_\")
 
-h, --help    Zeigt diese Hilfe und beendet das Skript.
 
--no-log      Keine Log-Datei im Zielverzeichnis erzeugen. Standartgemäß
 
              wird im Zielverzeichnis eine Log-Datei angelegt, die die
 
              Original-Namen und die veränderten enthält.
 
              (chnames_jjmmtt_hhmm.log)
 
-r            Rekursiver Durchlauf; geht nicht mit -f
 
-u            Undo-Skript im Zielverzeichnis anlegen. In Verbindung mit -r
 
              wird das Skript nur ins oberste, nicht in die Unterverzeich-
 
              nisse geschrieben. Durch Aufruf dieses Skriptes werden die
 
              Original-Namen wiederhergestellt. (chnundo_jjmmtt_hhmm.sh)
 
              Beachte: Gleichnamige Dateien werden als Backup mit Endung
 
                        ~n~ gesichert, wobei n die Anzahl bedeutet. Diese
 
                        Backup-Dateien werden durch das Undo-Skript NICHT
 
                        wieder zurückbenannt!
 
--usage      Kurzhilfe zeigen und Skript beenden.
 
--version    Versionsinfo zeigen und Skript beenden.
 
 
Beachte: Es kann nur -d (und -D) oder -f angegeben werden. Werden doch beide
 
          Parameter genannt, wird nur -f ausgeführt, -d (und -D) nicht.
 
 
 
Hinweise:
 
---------
 
chnames.sh läßt sich nur UTF-8-kodiert in einer UTF-8-Shell verwenden!
 
Diverse Checks ermitteln, ob ein Dateiname in einer der folgenden Kodierun-
 
gen vorliegt: UTF-8, ASCII, ISO-8859-1 oder allgemein andere Kodierung.
 
Umbenannt werden Dateinamen in ISO-8859-1-Kodierung, UTF-8 und ASCII.
 
Namen, die anders kodiert sind, werden gesondert gekennzeichnet, jedoch
 
nicht verändert. Damit auch ISO-8859-1-Namen bearbeitet werden können, muss
 
iconv installiert sein. Sollte iconv nicht auffindbar sein, werden in ISO-
 
8859-1 vorliegende Namen nur gekennzeichnet, nicht umbenannt.
 
 
Dateien mit durchgehender Großschreibweise müssen ggf. manuell nachbearbei-
 
tet werden, da die Umlaute Ä, Ö, Ü nach Ae, Oe, Ue umbenannt werden.
 
 
ACHTUNG: Die Überprüfung, in welcher Kodierung ein Name vorliegt, ist nicht
 
          perfekt. Es ist nicht garantiert, dass sie immer richtig funktio-
 
          niert, obwohl in meinen Tests bislang alles gut lief.
 
          Ebenso bieten die in chnames.sh enthaltenen Umbenennungen nur
 
          einen Rahmen, der aber nicht in jedem Einzelfall das Optimum ist.
 
          Bitte mit offenen Augen genießen ;-)
 
 
 
Beispiele:
 
----------
 
 
chnames.sh
 
 
 
  ==> Benennt alle im aktuellen Verzeichnis liegenden Dateien um.
 
      Log-Datei landet im aktuellen Ordner.
 
 
chnames.sh -d ~/mp3/Deutsches -g -u -r
 
 
 
  ==> Benennt rekursiv alle Dateinamen ab dem angegebenen Verzeichnis um;
 
      ersetzt dabei die Zeichen \"&\" und \"+\" durch ein deutsches \" und \".
 
      Undo-Skript wird im angegebenen Verzeichnis angelegt, Log-Dateien in
 
       jedem bearbeiteten Ordner.
 
 
chnames.sh -D -d Jazz --no-log
 
 
 
  ==> Benennt alle Unterverzeichnisse des Ordners Jazz um. Geht dabei nicht
 
      rekursiv vor. Legt keine Log-Datei an.
 
 
chnames.sh -f \"~/mp3/Deutsches/Comedian Harmonists - Wochenend und \\
 
Sonnenschein.mp3\" -f \"~/mp3/Ethnic/04 - Touré Kunda - Aïyayao\"
 
 
 
  ==> Umbenennen einzeln angegebener Dateien; Umbenennungsvorgang wird nur
 
      per Shell ausgegeben, nicht in eine Log-Datei.
 
 
chnames.sh -r --check
 
 
 
  ==> Reiner Test: Was würde wie verändert werden, wenn es passieren würde.
 
      Prüft rekursiv alle Dateien. Ausgabe per Shell.
 
 
chnames.sh -r -d ~/mp3/Classic --echeck
 
 
 
  ==> Reiner Test, günstigerweise nach Umbenennung auszuführen: überprüft,
 
      ob nicht berücksichtigte Sonderzeichen übrig sind. Durchsucht rekur-
 
      siv die Inhalte des angegebenen Verzeichnisses. Ausgabe aller Namen,
 
      die Zeichen ausserhalb des ASCII-Bereichs oder Leerzeichen enthalten,
 
      erfolgt per Shell.
 
 
 
Noch ein Tip:
 
-------------
 
 
find . -name \"chnames*.log\" -exec cat \"{}\" \";\" -ok rm \"{}\" \";\"
 
 
 
  ==> Schneller Überblick nach rekursivem Umbenennen:
 
      Sucht ab dem aktuellen Verzeichnis rekursiv nach allen von chnames.sh
 
      angelegten Log-Dateien, zeigt deren Inhalt mit cat an gefolgt von einer
 
      Abfrage, ob die Log-Datei gelöscht werden soll oder nicht.
 
"
 
 
echo "$HILFE" | less
 
 
}
 
}
+
 
+
# End function start_restore
kurzhilfe()
+
#==========================================================================
{
+
# Main programm
USAGE="
+
#
Benutzung: chnames.sh <-d [dir]> <-D> <-g> <-r> <--check|--echeck|--no-log|-u>
+
# Eingabe für Superuser
--------- chnames.sh <-f [datei]>... <-g> <--check|--echeck>
+
# PASSWORD=$(zenity --password)
          chnames.sh <-h|--usage|--version>
+
# echo $PASSWORD | sudo -S su
 +
# "Access Denied !!!"
 +
#
 +
OPERATION=$(zenity --list \
 +
                  --title="Aktion wählen ..." \
 +
                  --width=800 --height=400 \
 +
                  --column="Nummer" --column="Aktion" --column="Beschreibung" \
 +
                    1 Backup "Ausführung eines inkrementellen Backups." \
 +
                    2 Restore "Wiederherstellung aus gesicherten Daten.")
 +
 
 +
case $OPERATION in
 +
    1)
 +
    start_backup
 +
    echo "Backup wurde am: $DATE um $TIME durchgefürt und $RESULT Bytes gesichert/aktualisiert" \
 +
          >> /tmp/backup-restore-de.log 2>&1
 
    
 
    
--check      Testdurchlauf
+
     verify_exit_status
-d [dir]     Verzeichnis angeben
+
    ;;
-D            Verzeichnisse umbenennen
+
 
--echeck      Extra-Check, sucht u.a. nicht berücksichtigte Zeichen
+
     2)
-f [file]     Einzelne Datei oder Verzeichnis umbenennen; -f pro Angabe
+
    start_restore
-g            Verwende Deutsch für Ersetzung von \"&\", \"+\" und \"°\"
+
    echo "Wiederherstellung wurde am: $DATE um $TIME durchgeführt und $RESULT Bytes gesichert/aktualisiert" \
-h, --help    Ausführlichere Hilfe
+
          >> /tmp/backup-restore-de.log 2>&1
--no-log     Keine Log-Datei(en) anlegen
+
 
-r            Rekursiv
+
    verify_exit_status
-u            Undo-Skript anlegen (chnundo_jjmmtt_hhmm.sh)
+
    ;;
  --usage      Kurzhilfe
+
   
--version    Versionsinfo
+
    *)
"
+
     verify_exit_status
+
    ;;
echo "$USAGE"
+
esac
}
+
#
+
exit 0
+
#==========================================================================
versinfo()
+
</pre>
 +
 
 +
=== BASH Skript: Filtert nur die Fehlermeldungen von Log Dateien ===
 +
 
 +
Diese Skript benutzt mit [https://de.wikipedia.org/wiki/Zenity Zenity] eine graphische Schnittstelle mit der der User einfach
 +
eine Suchergebnisse von Log Dateien angezeigt bekommt.
 +
 
 +
<pre>
 +
#!/bin/bash -x
 +
#=============================================================================
 +
#
 +
# (c) LUG-VS (GPL)
 +
#
 +
# Beschreibung:                Filtert nur die Fehlermeldungen von Log Dateien
 +
#                              in /var/log.
 +
# Zusätzliche Pakete:          Zenity-Library
 +
# Skript-Name:                  errorlog-DE.bash
 +
# Version vom 29.04.2021 (Deuch)
 +
# Letze Änderung: am 29.04.2021
 +
#
 +
# Autor: Giorgio Giuseppe Cotardo
 +
#                              (giuseppe.codardo@googlemail.com)
 +
#
 +
#=============================================================================
 +
# Initialisierung und definition von Variabeln
 +
echo $PATH   
 +
RESPONSE=0
 +
RETURN_VAL=0
 +
YES=0
 +
NO=1
 +
#
 +
#=============================================================================
 +
#                                SUCH-FUNKTION
 +
#=============================================================================
 +
function search_error_log
 
{
 
{
VERSION="
+
SELECTION=$(zenity --list \
chnames.sh - Dateinamen ändern durch Ersetzen unliebsamer Zeichen.
+
                  --title="Option wählen ..." \
Version 1.9.0 vom 15.10.2012
+
                  --width=800 --height=400 \
+
                  --column="Nr." --column="Datei" --column="Beschreibung" \
Dieses Programm ist freie Software. Details sind zu finden in der GNU
+
                  1 boot "Log von boot" \
General Public License Version 2.0 (siehe Datei COPYING)."
+
                  2 kernel "Log der geladene kernel" \
+
                  3 system "System log" \
echo "$VERSION"
+
                  4 apport "Log von unerwartete Fehlermeldung" \
 +
                  5 auth "System Anmeldung bzw. Login")
 +
                 
 +
case $SELECTION in
 +
    1)
 +
      grep fail /var/log/boot.log > /tmp/resultlog.txt
 +
      RETURN_VAL=$?
 +
      FILE=/tmp/resultlog.txt
 +
      if [ $RETURN_VAL -eq $YES ]; then
 +
      zenity --text-info \
 +
            --width=800 --height=400 \
 +
            --title="Suchergebnis in der Datei boot.log" \
 +
            --filename=$FILE
 +
  else
 +
  zenity --info \
 +
  --width=400 --height=100 \
 +
  --text="Kein Suchtreffer."
 +
      fi
 +
      ;;
 +
      2)
 +
      grep fail /var/log/kern.log > /tmp/resultlog.txt
 +
      RETURN_VAL=$?
 +
      FILE=/tmp/resultlog.txt
 +
      if [ $RETURN_VAL -eq $YES ]; then
 +
      zenity --text-info \
 +
              --width=800 --height=400 \
 +
              --title="Suchergebnis in der Datei kern.log." \
 +
              --filename=$FILE
 +
    else
 +
    zenity --info \
 +
    --width=400 --height=100 \
 +
    --text="Kein Suchtreffer."
 +
      fi
 +
      ;;
 +
      3)
 +
      grep fail /var/log/syslog > /tmp/resultlog.txt
 +
      RETURN_VAL=$?
 +
      FILE=/tmp/resultlog.txt
 +
      if [ $RETURN_VAL -eq $YES ]; then
 +
      zenity --text-info \
 +
              --width=800 --height=400 \
 +
              --title="Suchergebnis in der Datei syslog." \
 +
              --filename=$FILE
 +
    else
 +
    zenity --info \
 +
    --width=400 --height=100 \
 +
    --text="Kein Suchtreffer."
 +
      fi
 +
      ;;
 +
      4)
 +
      grep fail /var/log/apport.log > /tmp/resultlog.txt
 +
      RETURN_VAL=$?
 +
      FILE=/tmp/resultlog.txt
 +
      if [ $RETURN_VAL -eq $YES ]; then
 +
      zenity --text-info \
 +
              --width=800 --height=400 \
 +
              --title="Suchergebnis in der Datei apport.log." \
 +
              --filename=$FILE
 +
    else
 +
    zenity --info \
 +
    --width=400 --height=100 \
 +
    --text="Kein Suchtreffer."
 +
      fi
 +
      ;;
 +
      5)
 +
      grep fail /var/log/auth.log > /tmp/resultlog.txt
 +
      RETURN_VAL=$?
 +
      FILE=/tmp/resultlog.txt
 +
      if [ $RETURN_VAL -eq $YES ]; then
 +
      zenity --text-info \
 +
              --width=800 --height=400 \
 +
              --title="Suchergebnis in der Datei auth.log." \
 +
              --filename=$FILE
 +
    else
 +
    zenity --info \
 +
    --width=400 --height=100 \
 +
    --text="Kein Suchtreffer."
 +
      fi
 +
      ;;
 +
      *)
 +
esac
 +
#
 +
zenity --question \
 +
      --width=400 --height=100 \
 +
--text="Mit Suchen fortsetzen?"
 +
RESPONSE=$?
 
}
 
}
   
+
#=============================================================================
   
+
#                                    MAIN
# Encoding prüfen
+
#=============================================================================
checkenc()
+
while [ $RESPONSE -eq $YES ]; do
 +
    search_error_log
 +
done
 +
echo $RESPONSE
 +
 
 +
             
 +
     
 +
 
 +
 
 +
</pre>
 +
 
 +
=== BASH Skript: Zerlegt eine komprimierte Datei in gleichem große Teile oder baut eine bereits gesplitterte Datei wieder zusammen ===
 +
 
 +
Diese Skript benutzt die graphische Schnittstelle [https://de.wikipedia.org/wiki/Zenity Zenity].
 +
 
 +
<pre>
 +
#!/bin/bash -x
 +
#=============================================================================
 +
#
 +
# (c) LUG-VS (GPL)
 +
#
 +
# Beschreibung:            Splittert / zerlegt eine Datei in eine gewünschene
 +
#                          Größe und nach auswahl, verkettenet es in einem
 +
#                          urprungliche Größe.
 +
#                          Die Datei muß zuerst komprimiert in erlaubte Format
 +
#                          sein: .zip, .tar, .gz, .rar, .xz
 +
#                          Die Dateiname werden mit einem Zufallzahl benannt.
 +
# Zusätzliche Pakete:      Zenity-Library  
 +
# Skript-Name:              split&cat-de.bash
 +
# Version:                  vom Mon 29 Dec 2014 12:06:22 CEST  (Deutsch)
 +
# Letze Änderung:          am  Sa 28 Sep 2019 12:24:11 CEST
 +
# Bemerkung:                Bei Dateiname oder Ordnername
 +
#                          darf kein Leerezeichen bzw. Sonderzeichen
 +
#                          dazwischen sein.
 +
#                          Nur mit Runlevel 5 bzw. xorg ausführbar.
 +
# Autor:                    Giorgio Giuseppe Codardo
 +
#                          (giuseppe.codardo@googlemail.com)
 +
#
 +
#=============================================================================
 +
# Initialisierung und definition von Variabel
 +
echo $PATH
 +
export STATE=0
 +
NEWDIR=$RANDOM
 +
STATUS=$?
 +
ZENITYPATH="/usr/bin/zenity"
 +
INFOFILE="/home/INFO.txt"
 +
#                     
 +
#=============================================================================
 +
#                            FUNKTION SPLIT
 +
#=============================================================================
 +
# Datei wählen ...
 +
function Split()
 
{
 
{
NAME="${i##*/}"
+
  FILENAME=${FILENAME//' '/'/'}
ORT="${i%/*}"
+
#
+
#-----------------------------------------------------------------------------
# Wenn NAME leer, sobald alle Zeichen aus ASC daraus entfernt wurden = ASCII
+
# Extension der Datei überprüfen gz, tar o tar.gz etc.
if test -z "${NAME//$ASC}" ; then
+
#
ENC="ASCII"
+
#-----------------------------------------------------------------------------
else
+
ESTENSIONE=${FILENAME:(-3)}
if test -z "${NAME//$UTF}" ; then
+
 
  ENC="UTF-8"
+
case "$ESTENSIONE" in
else
+
 
  # Wenn iconv gefunden, dann Namens-Umwandlung testen
+
  "zip" )
  if test -n "$ICONVDA" ; then
+
  STATE=1
    NAMECONV=`echo "$NAME" | iconv -f ISO-8859-1 -t UTF-8`
+
  ;;
    if test -z "${NAMECONV//$LAT}" ; then
+
 
      ENC="ISO-8859-1"
+
  "tar" )
    else
+
  STATE=1
      ENC="unbekannt"
+
  ;;
      # Für umbenennen() - Standart = 1 = umbenennen
+
 
      UMB=0
+
  ".gz" )
    fi
+
  STATE=1
  # Ansonsten ist auch ISO-8859-1 unbekannt
+
  ;;
  else
+
 
    ENC="unbekannt"
+
  "rar" )
    UMB=0
+
  STATE=1
  fi
+
  ;;
fi
+
 
 +
  ".xz" )
 +
  STATE=1
 +
  ;;
 +
 
 +
  * )    # Als default
 +
  STATE=0 # für andere Dateifomat.
 +
  ;;
 +
 
 +
esac 
 +
 
 +
 
 +
if [ $STATE == 0 ]; then
 +
  zenity --error \
 +
        --text="Eine unkomprimiert Datei wurde gewählt! "
 +
  exit -1
 
fi
 
fi
 +
#-----------------------------------------------------------------------------
 +
#  NEWDIR=`date`
 +
#  NEWDIR=${NEWDIR//','/'_'}
 +
#  NEWDIR=${NEWDIR//' '/'_'}
 +
 +
  FILESIZE=$(zenity --scale \
 +
                    --text="Maximale Größe der gespliterte Datei einstellen (in MByte)" \
 +
                    --value=100)
 +
 +
  FACTOR=1000000 #
 +
  FILESIZE=$((FILESIZE*FACTOR))
 +
  #-----------------------------------------------------------------------------
 +
  # Eine Orden mit gleicher Dateiname erzeugen ...
 +
  #-----------------------------------------------------------------------------
 +
  DESTINATION=$(zenity --file-selection \
 +
                      --directory \
 +
                      --title="Zielordner auswählen ...")
 +
 +
  if zenity --question \
 +
            --text="Eine Zufalldateiname erzeugen?"; then
 +
 +
      mkdir /$DESTINATION/"$NEWDIR"
 +
      cd /$DESTINATION/$NEWDIR
 +
  else
 +
      NEWDIR=$(zenity --entry \
 +
                      --title="Ordnername eingeben." \
 +
                      --text="Eine neue Ordner wird erzeugt" \
 +
                      --entry-text="New Directory")
 +
 +
      mkdir /$DESTINATION/"$NEWDIR"
 +
      cd /$DESTINATION/$NEWDIR
 +
 +
  fi
 +
  #
 +
  # Hier geht's los ...
 +
  #
 +
  split --numeric-suffix --byte=$FILESIZE $FILENAME $NEWDIR"_"
 +
  #
 +
  #
 +
  zenity --notification\
 +
        --window-icon="Info" \
 +
        --text="I files frazionati si trovano nella directory di destinazione."
 
}
 
}
+
 
+
#=============================================================================
# Reiner Check auf unliebsame Zeichen
+
#                            FUNKTION CAT
extracheck()
+
#=============================================================================
 +
function Cat()
 
{
 
{
# Encoding prüfen
+
  FILELIST=$(zenity --file-selection \
checkenc
+
                    --multiple \
 +
                    --title="Alle Datei zum verketten markieren ...")
 +
 
 +
  FILELIST=${FILELIST//'|'/' '}
 +
 
 +
 
 +
DESTINATION=$(zenity --file-selection \
 +
                      --directory \
 +
                      --title="Ziel Ordner wählen ...")
 +
  OUTPUTFILE=$(zenity --entry \
 +
                      --title="Datename mit entprechend extension eingeben ..." \
 +
                      --text="Neue Dateiname" \
 +
                      --entry-text="*.gz, *.zx, *.zip, *.tar")
 +
 
 +
  cat $FILELIST > $DESTINATION/$OUTPUTFILE
 
   
 
   
# Vergleichsname
+
  zenity --notification\
VNAME="${NAME//$GUTZEI}"
+
        --window-icon="Info" \
+
        --text="Concatenate erfolgreich ausgeführt und befinden sich in \
# Wenn noch Zeichen in VNAME stehen, dann sind dies unliebsame Zeichen.
+
      $OUTPUTFILE."
if test -n "$VNAME" ; then
 
FOUND=1
 
if test "$ORT" == "`pwd`" ; then
 
  echo "$NAME ...  Kodierung: $ENC"
 
else
 
  echo "${i/`pwd`\/}  ... Kodierung: $ENC"
 
fi
 
fi
 
 
}
 
}
 +
#=============================================================================
 +
#                              MAIN
 +
#=============================================================================
 +
while
 +
    # Prüfen ob zenity installiert ist ...
 +
    find $ZENITYPATH
 +
    if [$STATUS = 1]
 +
    then
 +
        echo "Zenity nicht gefunden!"
 +
    fi       
 
   
 
   
   
+
      zenity --question \
# Funktion zum Umbenennen
+
            --text="Weiter mit dem Script?" ; do
umbenennen()
+
     
 +
     
 +
      zenity --text-info \
 +
            --title="Informationen" \
 +
            --filename=$INFOFILE \
 +
            --checkbox="Einverstanden!"
 +
 
 +
    # Die Rückgabewert entspricht die string von split&cat
 +
      RESULT=$(zenity --list \
 +
                      --title="Gewünschene operation wählen:" \
 +
                      --column="Operation" --column="Beschreibung" \
 +
                      SPLIT "Splittert in gleichem Größe" \
 +
                      CAT "Verketten die gesplitterte Datei" )
 +
 
 +
      if [ $RESULT = "SPLIT" ]
 +
          then FILENAME=$(zenity --file-selection \
 +
                                --title="Datei auswählen")
 +
              Split # Function Call
 +
          else
 +
              $RESULT = "CAT"
 +
              Cat  # Function Call
 +
      fi
 +
done       
 +
exit 0
 +
#=============================================================================
 +
</pre>
 +
 
 +
=== Einfache Frontend für GnuGPG ===
 +
 
 +
Diese Skript benutzt die graphische Schnittstelle [https://de.wikipedia.org/wiki/Zenity Zenity].
 +
<pre>
 +
#!/bin/bash
 +
# -x stehet für Debugging.
 +
#
 +
# (c) LUG-VS (GPL)
 +
#
 +
# Titel:                    Einfache GPG-Frontend
 +
# Verwendete Library:      Zenity-Library (GTK). 
 +
# Scriptname:              gpg-V2-DE.bash
 +
# Erstellt am:              16.07.2023
 +
# Author:                  Giorgio Giuseppe Codardo           
 +
#                          giuseppe.codardo@googlemail.com
 +
# Co-Author:                Uwe S., Julian
 +
#---------------------------------------------------------------------------
 +
# Letzte Update:            23.07.2023 - WICHTIG!.
 +
#---------------------------------------------------------------------------
 +
# Warnungen:                Die Ordner dürfen keine Leerzeichen erhalten.
 +
#                          Ein verlorener Schlüssel, kann Datenverlust
 +
#                          verursachen.
 +
#                          Zuerst testen!
 +
# Beschreibung:                                               
 +
# Der Anwender dieses Scripts muss bereits einen Schlüssel
 +
# besitzten.                         
 +
# Dies wird durch das Kommando "gpg --gen-key" ausgeführt und
 +
# der Schlüssel sollte in dem Schlüsselanhänger (z.B.Seahorse) gespeichert sein. 
 +
# Beispiele:
 +
# gpg --gen-key    // Wird einen privaten Schlüssel erzeugen.
 +
# gpg -e -r $(whoami) filename.txt  // Wird die Datei filename.txt.gpg erzeugt.
 +
# gpg --output neuename.txt --decrypt filename.txt.gpg // Datei entschlüsseln.
 +
# Der Pfad in WORKSPACE und TRASH funktiiniertnur für den eigenen Benutzer-Namen.
 +
# Um der Schlüssel zu importieren, einfach der Datei asc su /home/$(whoami)/
 +
# .gnupg kopieren.
 +
#
 +
#===========================================================================
 +
echo $PATH
 +
#
 +
WORKSPACE="/home/$(whoami)/Desktop" # Standard Pfad. Abfrage folgt ...
 +
TRASH="/home/$(whoami)/.local/share/Trash/files"
 +
EXEC=0 #
 +
COUNT=0 # Zähler der Script-Wiederholungen.
 +
#
 +
#=========================================================================== 
 +
# Die Befehlen werden nach Fehler geprüft. Ist der Fall, wird der Vorgang
 +
# abgebrochen.
 +
function check_error
 
{
 
{
# Encoding prüfen
+
  if [ $? -ne 0 ]; then
checkenc
+
   zenity --error \
+
           --width=400 --height=200 \
# Ausgabe des akt. Original-Namens
+
           --text="Ein Fehler ist aufgetreten: Das Script wird abgebrochen!"  
if test "$ORT" == "`pwd`" ; then
+
   exit -1
echo "Org: $NAME"
 
else
 
# nur relativen Pfad ausgeben
 
echo "Org: ${i/`pwd`\/}"
 
fi
 
 
 
# Wenn Kodierung unbekannt, nur Shell-Ausgabe
 
if test $UMB -eq 0 ; then
 
echo -e "---  keine Änderung  ...  Kodierung ${ENC}\n"
 
 
else
 
 
if test "$ENC" == "ISO-8859-1" ; then
 
  x="$NAMECONV"
 
else
 
   x="$NAME"
 
fi
 
 
# Umbenennungen ausführen
 
# -----------------------
 
 
# mehrere Leerzeichen durch eins ersetzen
 
x="`echo \"$x\" | sed 's/ \{2,\}/ /g'`"
 
 
x="`echo \"$x\" | sed 's/ --* /-/g'`"  # Leer (mind. 1x: -) Leer durch -
 
x="`echo \"$x\" | sed 's/ __* /_/g'`"  # Leer (mind. 1x: _) Leer durch _
 
 
x="${x//. /-}"          # .Leerzeichen durch -
 
x="${x//,[ -]/_}"      # ,Leerzeichen ,_ durch -
 
x="${x//,/.}"           # , durch .
 
 
x="${x//[\'\"\`´\?\!\^#\*¿¡]}"    # entfernt ' " ` ´ ? ! ^ # * ¿ ¡
 
  x="${x// [\[\(\{\<\]\)\}\>] /-}"  # Leer{[(<}])>Leer durch -
 
  x="${x// [\[\(\{\<\]\)\}\>]/-}"    # Leer{[(<}])> durch -
 
  x="${x//[\[\(\{\<\]\)\}\>] /-}"    # {[(<}])>Leer durch -
 
  x="${x//[\[\(\{\<\]\)\}\>]/-}"    # {[(<}])> durch -
 
 
  x="${x// /-}"           # Leer durch -
 
  x="${x//[:\;]/.}"      # : ; durch .
 
 
  # Umlaute
 
  x="${x//ä/ae}"
 
  x="${x//ö/oe}"
 
  x="${x//ü/ue}"
 
  x="${x//Ä/Ae}"
 
  x="${x//Ö/Oe}"
 
  x="${x//Ü/Ue}"
 
  x="${x//ß/ss}"
 
 
  # Akzentzeichen
 
  x="${x//[ÀÁÂÃÅ]/A}"
 
  x="${x//Æ/AE}"
 
  x="${x//[ÇĆĈĊČ]/C}"
 
  x="${x//[ÈÉÊË]/E}"
 
  x="${x//[ÌÍÎÏ]/I}"
 
  x="${x//Ñ/N}"
 
  x="${x//[ÒÓÔÕØ]/O}"
 
  x="${x//[ŚŜŞŠ]/S}"
 
  x="${x//[ÙÚÛ]/U}"
 
  x="${x//Ý/Y}"
 
  x="${x//[ŹŻŽ]/Z}"
 
  x="${x//[àáâãå]/a}"
 
  x="${x//æ/ae}"
 
  x="${x//[çćĉċč]/c}"
 
  x="${x//[èéêë]/e}"
 
  x="${x//[ìíîï]/i}"
 
  x="${x//ñ/n}"
 
  x="${x//[òóôõø]/o}"
 
  x="${x//[śŝşš]/s}"
 
  x="${x//[ùúû]/u}"
 
  x="${x//[ýÿ]/y}"
 
  x="${x//[źżž]/z}"
 
 
  # + & je nach Sprachoption ersetzen
 
  test $GER -eq 0 && x="${x//[\+&]/_and_}" || x="${x//[\+&]/_und_}"
 
  # ° je nach Sprachoption ersetzen
 
  test $GER -eq 0 && x="${x//°/_deg_}" || x="${x//°/_Grad_}"
 
  # - an erster Stelle des Namens
 
  test "${x:0:1}" == "-" && x="${x/[_-]}"
 
 
  # mehrere aufeinanderfolgende . - _ ~ reduzieren zu 1 Zeichen . - _ ~
 
  x="`echo \"$x\" | sed 's/\.\{2,\}/./g'`"
 
  x="`echo \"$x\" | sed 's/-\{2,\}/-/g'`"
 
  x="`echo \"$x\" | sed 's/_\{2,\}/_/g'`"
 
  x="`echo \"$x\" | sed 's/~\{2,\}/~/g'`"
 
 
  # Ungewöhnliche Zeichenkombinationen, die durch chnames.sh selbst
 
  # entstehen könnten, beseitigen
 
  x="${x//-_/-}"      # -_ durch -
 
  x="${x//_-/-}"      # _- durch -
 
  x="${x//[_\-~]./.}"  # _. -. ~. durch .
 
  x="${x//._/-}"      # ._ durch - (passiert häufiger in MP3)
 
  x="${x//.-/-}"      # .- durch -
 
  x="${x//[_\-]~/~}"  # _~ -~ durch ~
 
  x="${x//~[_\-]/~}"  # ~_ ~- durch ~
 
 
  # Durch die letzten Ersetzungen könnte es wieder zu doppelten Z. kommen:
 
  x="`echo \"$x\" | sed 's/\.\{2,\}/./g'`"
 
  x="`echo \"$x\" | sed 's/-\{2,\}/-/g'`"
 
  x="`echo \"$x\" | sed 's/~\{2,\}/~/g'`"
 
 
 
  # Betr. mv und Log-Datei
 
  if test "$i" != "${ORT}/$x" ; then
 
 
    # Für das Schreiben des Undo-Skripts
 
    CHANGED=1
 
 
 
    # Umbenennen
 
    if test $CHECK -eq 0 ; then
 
   
 
      mv -f --backup=numbered "$i" "${ORT}/$x"
 
   
 
      # Für Undo-Skript
 
      if test $USKRIPT -eq 1 ; then
 
        Sx="${x//\`/\\\`}"
 
        Sx="${Sx//\"/\\\"}"
 
        Si="${i//\`/\\\`}"
 
        Si="${Si//\"/\\\"}"
 
     
 
        SINHALT="$SINHALT
 
echo \"von:  ${ORT}/$Sx\"
 
echo \"nach: $Si\"
 
mv -f --backup=numbered \"${ORT}/$Sx\" \"$Si\"
 
echo
 
"
 
      fi
 
    fi
 
 
 
    # Ausgabe des neuen Namens auf der Shell
 
    if test "$ORT" == "`pwd`" -o "$ORT" == "." ; then
 
      echo -e "NEU: ${x}\n"
 
    else
 
      echo -e "NEU: ${ORT/`pwd`\/}/${x}\n"
 
    fi
 
    
 
    # Nur Veränderungen in Log-Datei schreiben
 
    if test "$DOLOG" == "ja" ; then
 
      if test "$ENC" == "ISO-8859-1" ; then
 
        echo "Org:  $NAME (ISO-8859-1)" >> "${ORT}/chnames_${DATUM}.log"
 
      else
 
        echo "Org:  $NAME" >> "${ORT}/chnames_${DATUM}.log"
 
      fi
 
      echo -e "NEU:  ${x}\n" >> "${ORT}/chnames_${DATUM}.log"
 
    fi
 
 
 
  else
 
 
    # nur Shell-Ausgabe
 
    echo -e "---  keine Änderung\n"
 
 
 
 
   fi
 
   fi
+
fi
 
 
}
 
}
+
    WORKSPACE=$(zenity --file-selection \
+
                      --directory \
# BEGINN
+
                      --multiple \
# ======
+
                      --title="Schreibtisch wählen.")
+
                      #  
# chnames.sh funktioniert NICHT KORREKT in der bash-Version 2.05b.
+
                      check_error
if test ${BASH_VERSINFO[0]} -lt 3 ; then
+
 
  echo
+
cd $WORKSPACE
  echo "chnames.sh - ACHTUNG! - bash-Version"
+
#=========================================================================== 
  echo
+
#
  echo "chnames.sh wurde getestet mit bash-Version 2.05b und Versionen ab 3.0."
+
#___________________________________________________________________________
  echo "Mit der Version 2.05b gab es Fehler."
+
while [ $EXEC != 1 ]; do
  echo "Es ist daher mindestens Version 3.0 noetig!"
+
 
  echo
+
if [ $COUNT -eq 0 ]; then
  echo "chnames.sh beendet"
+
zenity --warning \
  echo
+
      --width=400 --height=200 \
  exit 1
+
      --text="Warnung! Zuerst einen gpg-Schlüssel besitzen.\n
 +
              Dateien und Ordner ohne Leerezeichen verwenden."
 +
     
 
fi
 
fi
+
CHOOSE=$(zenity --list \
# Wenn chnames.sh NICHT in einem UTF-8-Terminal läuft, Abbruch und Meldung
+
                --title="Die Operation zum Ausführen wählen ..." \
#if test -z "`locale | grep 'LC_CTYPE=.*UTF-8'`" ; then
+
                --width=800 --height=400 \
#  echo
+
                --column="Pos." --column="Operation" --column="Beschreibung" \
#  echo "chnames.sh - ACHTUNG! - UTF-8 benoetigt"
+
                  1 encrypt "Dateien / Ordner verschlüsseln" \
#  echo
+
          2 decrypt "Entschlüsseln eines tar Archiv.")
#  echo "chnames.sh benoetigt zur korrekten Ausfuehrung ein UTF-8-Terminal."
+
          check_error
#  echo "Unter Systemen mit ISO-8859-1-Kodierung kann, vorausgesetzt die"
+
 
#  echo "entsprechende locale steht zur Verfuegung, ein UTF-8-xterm z.B. wie"
+
if [ $CHOOSE -eq 1 ]; then
#  echo "folgt gestartet werden:"
+
      NAME=$(zenity --entry \
#  echo
+
                    --title="Schlüsselname." \
#  echo " LC_CTYPE=\"de_DE.UTF-8\" xterm"
+
                    --text="Scheiben Sie den Namen eines Schlüssels" \
#  echo
+
                    --entry-text="Key")
#  echo "chnames.sh beendet"
+
                    check_error                 
#  echo
+
 
#  exit 1
+
      SOURCE=$(zenity --file-selection \
#fi
+
                      --directory \
+
                      --multiple \
# Meldung falls das Skript unnatürlich beendet wird.
+
                      --title="Dateien / Ordner zum archivieren wählen.")
trap 'echo "chnames.sh abgebrochen" ; echo "letzter Stand: $i" ; exit 1' 1 2 15
+
                      # --directory # nur für Dateien.
+
                      check_error
+
      SOURCE=${SOURCE//|/' '} # Das Symbol '|' (pipe) durch ' ' (space) ersetzten.
# 0 = Default; wird bei -f = 1 gesetzt
+
 
NURF=0
+
      #  
# Falls nicht anders angegeben: aktuelles Verzeichnis
+
      FILE_ARCH=$(zenity --entry \
ORT="`pwd`"
+
                          --title="Archiv wird erzeugt." \
# Falls nicht anders angegeben: Dateien umbenennen (d = Verz.)
+
                          --text="Dateiname mit der Extension .tar schreiben." \
TYP="f"
+
                          --entry-text="File.tar")
# Für Ersetzung von "&", "+" und "°" (default = Englisch = 0; Deutsch = 1)
+
                          check_error
GER=0
+
                   
# Log-Datei: ja = Default; nein = wenn -f oder --no-log
+
      tar --create --file $FILE_ARCH $SOURCE
DOLOG="ja"
+
      #
# Für Eintrag in Log-Datei, falls keine Änderung
+
      #     zenity --progress \
CHANGED=0
+
      #           --title="Erzeugung des Archivs wird ausgeführt..." \
# Für Testdurchläufe (--check) (0 = tun; 1 = check)
+
      #            --width=400 --height=200 \
CHECK=0
+
      #            --text="Warten ..." \
# Wenn rekursiv = 1
+
      #           --pulsate \
REC=0
+
      #            --auto-close 
# Undo-Skript erstellen = 1
+
      check_error   
USKRIPT=0
+
      # Hier wird das erzeugte Archiv verschlüsselt.
# Für Extra-Check = 1
+
      gpg --encrypt --recipient $NAME "$FILE_ARCH"  
ECHECK=0
+
      #|
+
      #            zenity --progress \
+
      #            --title="Verschlüsselug wird ausgeführt ..." \
# Parameterabfrage
+
      #            --width=400 --height=200 \
while test $# -gt 0; do
+
      #           --text="Warten ..." \
  case $1 in
+
      #            --pulsate \
    --check ) CHECK=1 ; DOLOG="nein" ; USKRIPT=0 ;;
+
      #            --auto-close 
    -d ) ORT="$2" ; shift ;;
+
 
    -D ) TYP="d" ;;
+
      check_error
    --echeck) CHECK=1 ; DOLOG="nein" ; USKRIPT=0 ; ECHECK=1
+
 
              FOUND=0 ;;
+
      #
     -f )
+
      mv --force $FILE_ARCH $TRASH
        if test $NURF -eq 0 ; then
+
      check_error
           if test $REC -eq 0 ; then
+
 
            NURF=1
+
      zenity --notification \
            DOLOG="nein"
+
              --window-icon="Info" \
            USKRIPT=0
+
              --text="Verschlüsselung war erfolgreich!"
            FILES="$2"
 
           else
 
            kurzhilfe ; exit 1
 
          fi
 
        else
 
          FILES="${FILES}\n$2"
 
        fi
 
        shift ;;
 
    -g ) GER=1 ;;
 
    --no-log ) DOLOG="nein" ;;
 
    -r )
 
        # Wenn -f angegeben ist, darf NICHT rekursiv gesetzt sein
 
        if test -$NURF -eq 0 ; then
 
          REC=1
 
        else
 
           kurzhilfe ; exit 1
 
        fi ;;
 
    --version ) versinfo ; exit 0 ;;
 
    -u ) test $NURF -eq 0 && USKRIPT=1 || USKRIPT=0 ;;
 
    --usage ) kurzhilfe ; exit 0 ;;
 
    --help | -h ) benutzung ; exit 0 ;;
 
    * ) kurzhilfe ; exit 1 ;;
 
  esac
 
  shift
 
done
 
 
# Für Undo-Skript
 
SORT="$ORT"
 
 
# Leerzeichen nicht als Trenner ansehen
 
IFS=$'\n'
 
 
echo
 
 
# Wenn Extra-Check
 
if test $ECHECK -eq 1 ; then
 
  echo -e "*** chnames.sh - Starte Extra-Check ***\n"
 
# Wenn Check
 
elif test $CHECK -eq 1 -a $ECHECK -eq 0 ; then
 
  echo -e "*** chnames.sh - Starte Check ***\n"
 
# Wenn Umbenennen
 
else
 
  echo -e "*** chnames.sh - Starte Umbenennen ***\n"
 
 
fi
 
fi
 +
#___________________________________________________________________________
 +
# Hier wird die verschlüsselte Datei entschlüsselt.
 +
if [ $CHOOSE -eq 2 ]; then
 +
          NEW_FILE=$(zenity --entry \
 +
                            --title="Neu Archiv." \
 +
                            --text="Schreiben Sie den Namen der neuen Archiv-Datei mit Extension." \
 +
                            --entry-text="new-file.tar")
 +
                            check_error
 +
 +
            SOURCE=$(zenity --file-selection \
 +
                            --multiple \
 +
                            --title="Datei/en zum entschlüsseln wählen...")
 +
                            check_error
 +
        SOURCE=${SOURCE//|/' '}
 +
#
 +
        gpg --output $NEW_FILE --decrypt "$SOURCE"
 +
        check_error
 +
#
 +
zenity --notification \
 +
      --window-icon="Info" \
 +
      --text="Die Datei wurde erfolgreich entschlüsselt!"
 +
#___________________________________________________________________________
 +
zenity --question \
 +
      --text="Dateien von Archiv extraieren?"
 +
 +
      if [ $? -eq 0 ]; then
 
   
 
   
 +
                FILE=$(zenity --file-selection \
 +
                              --title="Datei mit *.tar wählen.")
 +
                              check_error
 
   
 
   
# Für alle Dateien/Verzeichnisse in 1 Verzeichnis oder rekursiv
+
#
if test $NURF -eq 0 ; then
+
                tar --extract --file $FILE -C /tmp
+
                check_error                     
  # Wenn 1 Verzeichnis (nicht rekursiv)
+
 
  if test $REC -eq 0 ; then
+
                zenity --notification \
    OK=0
+
                      --window-icon="Info" \
    # Wenn Extra-Check, Verzeichnis-test auf rx
+
                      --text="Entpacken der Datei wurde erfolgreich durchgeführt.\n
    if test $ECHECK -eq 1 ; then
+
                      Die Datei befindet sich im /tmp Ordner \n
      test -r "$ORT" -a -x "$ORT" && OK=1
+
                      Archiv vom Scheibtisch manuell löschen!"  
    else
+
      fi   
      test -r "$ORT" -a -w "$ORT" -a -x "$ORT" && OK=1
 
    fi
 
 
 
    # Wenn die vorherigen Abfragen OK, dann FILES füllen
 
    if test $OK -eq 1 ; then
 
      FILES=`find "$ORT" -maxdepth 1 -mindepth 1 -type "$TYP" | sort`
 
    else
 
      # Fehlermeldung + Abbruch
 
      echo "${ORT}:"
 
      echo "Berechtigungen überprüfen!"
 
      echo "*** chnames.sh beendet ***"
 
      echo
 
      exit 1
 
    fi
 
 
  # Wenn rekursiv
 
  else
 
    # Bei Verzeichnis-Umbenennung -r muss umgekehrt sortiert werden
 
    if test "$TYP" == "d" ; then
 
      FILES=`find "$ORT" -mindepth 1 -type "$TYP" | sort -r`
 
    # Bei Datei-Umbenennung aufsteigend sortieren
 
    else
 
      FILES=`find "$ORT" -mindepth 1 -type "$TYP" | sort`
 
    fi
 
   fi
 
 
fi
 
fi
+
let COUNT=COUNT+1
+
zenity --question \
# Wenn iconv vorhanden ist, können auch ISO-8859-1-Namen umbenannt bzw.
+
      --text="Mit dem Script fortsetzen? \n (Times = $COUNT)"
# bei --echeck die Kodierung ISO-8859-1 ermittelt werden.
+
      EXEC=$?
# Anmerkung: Eigentlich werden Namen per convmv automatisch und gut umkodiert;
+
done #  
# dessen Ausgabe läßt sich jedoch nicht abfangen, was hier sehr störend wäre.
+
exit 0 #  
# Statt iconv könnte ebensogut recode verwendet werden.
+
#===========================================================================
ICONVDA=`which iconv`
+
 
+
 
if test -n "$ICONVDA" ; then
+
</pre>
  # LAT = ISO-8859-1 - Hierin nicht enthalten: ¦¨©ª«¬­®¯²³¶·¸¹º»¼½¾
+
 
  LAT="[\]\[\!\"#\$%&\'\(\)\*\+,\-.0123456789:\;<=>\?ABCDEFGHIJKLMNOPQRSTUVWXYZ \\\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}~¡¢£¤¥§°±´µ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]"
+
====Anmerkung====
# UTF-8 - enthält alle alphanumerischen Zeichen, Space, Tab, Satzzeichen
+
 
UTF="[[:alnum:][:blank:][:punct:]]"
+
Anstatt des auf 'GTK' basierenden Zenity kann man natürlich auch das Qt/KDE-Pedant KDialog verwenden. Siehe auch:
fi
+
* Beschreibung im UbuntuUser Wiki zu [https://wiki.ubuntuusers.de/Zenity/ Zenity]
+
* Beschreibung im UbuntuUser Wiki zu [https://wiki.ubuntuusers.de/KDialog/ KDialog]
# ASCII-Zeichen für checkenc() - hierin nicht enthalten: / @
+
* Linux-User Beitrag [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2008/06/GUI-Komfort-fuer-Bash-Shell-und-Co Zenity und KDialog]
ASC="[\]\[\!\"#\$%&\'\(\)\*\+,\-.0123456789:\;<=>\?ABCDEFGHIJKLMNOPQRSTUVWXYZ \\\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}~]"
+
* Linux-User Gegenüberstellung [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2014/03/Mehr-Komfort Zenity und KDialog]
   
+
 
# Für extracheck() - Erwünschte Zeichen in Namen:
+
=== BASH Skript: Führt ein komplettes Backup Deines 'Thunderbird' aus ===
test $ECHECK -eq 1 && \
+
''aktualisiert am 22.05.2021''
GUTZEI="[-_~.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]"
+
 
+
Hier ein ganz einfaches Skript, das den eigenen .thunderbird-Ordner in einen Backup-Ordner (komprimiert) sichert. Das kann man noch optimieren, erweitern und auch automatisieren, wenn man will. In meinem Fall, genügt mir diese einfache Variante, weil ich es bewusst nach einzelnen Aktionen wie dem massenhaften Abrufen zahlreicher Mailkonten manuell einsetze. Es werden auch die Kalendereinträge im Kalendermodul ('Lightning') mit gesichert, wenn man dies benutzt. Dieses Skript setzt folgendes voraus: Ein Verzeichnis namens 'bin' und ein Verzeichnis mit dem Namen 'backup' im eigenen HOME-Verzeichnis sind vorhanden:
+
cd
# Für Namen in Log-Datei und Undo-Skript
+
mkdir bin backup
if test "$DOLOG" == "ja" -o $USKRIPT -eq 1 ; then
+
Das Skript muss in 'bin' abgespeichert werden. Der Name ist frei wählbar, ich habe es 'tbbup' ('''T'''hunder'''b'''ird '''B'''ack'''up''') genannt. Es muss nach dem Erstellen noch ausführbar gemacht werden:
  DATUM=`date +"%y%m%d_%H%M"`
+
  cd bin
fi
+
chmod u+x tbbup
+
Sobald man sich auf einer Konsole (Terminal) neu anmeldet, sollte bei einer Standard-Distribution wie z. B. Debian die Ausführung einfach durch die Eingabe von
# Undo-Skript vorbereiten
+
user@localhost ~ $ '''tbbup'''
if test $USKRIPT -eq 1 ; then
+
starten. (Hier bitte nur das fett Gedruckte eingeben. Der vorausgehende Teil ist der Prompt!) Wenn Thunderbird läuft, wird das Programm (Thunderbird) beendet.
+
 
  # Bei -d werden nur relative Pfade im Undo-Skript gesichert. Hiermit
+
'''Hintergrund''': Wenn Thunderbird gestartet ist, sollte man kein Backup machen, damit die Wiederherstellung überhaupt möglich wird. Bei laufendem TB existiert nämlich eine Lock-Datei, die einen Zeitstempel enthält. Die Datei wird beim Beenden gelöscht. Stellt man ein im laufenden Betrieb gesichertes TB später wieder her, macht diese Lock-Datei Probleme und TB kann anschließend nicht gestartet werden.
  # wird vor dem Umbenennen in das Verzeichnis gewechselt, aus dem der
+
 
  # ursprüngliche chnames.sh-Aufruf erfolgte.
+
Sollte Thunderbird nicht laufen, wird die Sicherung sofort ausgeführt.
  CDTO=`pwd`
+
 
+
<pre>
  SDATE=`date +"%c"`
+
#!/bin/bash
  SINHALT='#!/bin/bash'
+
# name of script: tbbup - Thunderbird Backup-Script
  SINHALT="$SINHALT
+
# license: GPLv2 or higher
+
# author: u.stippekohl@sophtwearteam.de
# chnames.sh Undo-Skript
+
# date of first creation: 12/05/2015 (Dec. 5, 2015)
# Generiert am $SDATE
+
# should do the following:
   
+
# check if thunderbird is running and stop it if so
echo
+
# than create a tar.gz-file named 'tb_[date]_[time].tar.gz in a directory
echo 'chnames.sh - Undo-Skript'
+
# named 'backup' in your home-directory
echo
+
#
   
+
killall -i thunderbird
if test \"\$1\" != \"--do\" ; then
+
tar cvfz ~/backup/tb_$(/bin/date +%F_%H:%M).tar.gz ~/.thunderbird/*
echo 'Aufruf per \"./chnundo_jjmmtt_hhmm.sh --do\", um zurück zu benennen.'
+
 
  echo 'Gleichnamige Ziele werden überschrieben und als Backup gesichert.'
+
exit 0
echo
+
</pre>
exit 1
+
'''Hinweis''': Beachte bitte, dass die Wiederherstellung über das [https://ss64.com/bash/tar.html tar]-Kommando auf den versteckten Ordner .thunderbird in Deinem HOME-Verzeichnis funktioniert:
fi
+
  tar -xzvf backup/tb_[YYYY-MM-DD_hh:mm].tar.gz .thunderbird
+
Mit absoluten Pfaden:
echo \"Wechsle in das Verzeichnis, wo chnames.sh ursprünglich aufgerufen wurde:\"
+
  tar -xzvf /home/[username]/backup/tb_[YYYY-MM-DD_hh:mm].tar.gz /home/[username]/.thunderbird
echo \"cd nach ${CDTO}/\"
+
wobei der Teil [YYYY-MM-DD_hh:mm] mit den tatsächlichen Werten für Datum und Uhrzeit ersetzt werden muss! Deshalb bitte nicht vergessen, dass vor dem 'thunderbird' ein Punkt sitzt:
cd \"$CDTO\"
+
  .thunderbird
echo
+
Der absolute Pfad wäre in diesem Fall also: '/home/[Dein Benutzername]/.thunderbird'.
echo 'Benenne um ...'
+
 
echo
+
=== BASH Skript: SYSInfo zum üben ===
"
+
 
fi
+
Dieses Skript ist nur zu Übungszwecken. inxi leistet hier wesentlich mehr und bessere Arbeit. Auch grafische Tools wie die Systemüberwachung sind sicherlich besser und übersichtlicher. Aber um zu verstehen, wie Skripte arbeiten und funktionieren und um einfach mal mit dem Skripten anzufangen, ist das eine gute Übung.
+
 
+
<pre>
for i in `echo -e "$FILES"` ; do
+
#!/bin/bash
+
# name of script: sysinfo
  # Falls später Problem mit Verzeichnis auftaucht:
+
# license: GPLv2 or higher
  WEITER="ja"
+
# author: u.stippekohl@sophtwearteam.de
  # Falls Namen in ISO-8859-1 vorliegen, dann = "ja"
+
# date of first creation: 04/29/2017 (Apr. 29, 2017)
  ISTISO="nein"
+
# should do the following:
  # Wenn Kodierung unbekannt = 0, sonst 1 (für umbenennen())
+
# output a salutation, introduce the hostname, display date
  UMB=1
+
# and time as well as the kernel version used and a final
+
# salutation at the end.
+
# Please consider to play with it and insert your own
  # Wenn -f oder -r: Verzeichnisrechte testen
+
# commands you are interrested in like e. g.
  if test $NURF -eq 1 -o $REC -eq 1 ; then
+
# cat /etc/debian_version; df -h ~; ls
    OK=0
+
echo "Welcome $(whoami)"
 
+
echo "My name is '$(hostname)'"
    # Wenn Extra-Check, Verzeichnistest auf rx, sonst rwx
+
echo "The date and time is $(date)"
    # (die bash ist viel schneller als ein Aufruf von dirname)
+
echo "My kernel version is $(uname -r)"  
    if test $ECHECK -eq 1 ; then
+
echo "Thank you for using sysinfo-script."
      test -r "${i%/*}" -a -x "${i%/*}" && OK=1
+
echo "Good bye!"
    else
+
</pre>
      test -r "${i%/*}" -a -w "${i%/*}" -a -x "${i%/*}" && OK=1
+
 
    fi
+
Da dieses Skript unter der GPL v2 steht, darf man es verwenden, ändern und wieder weitergeben / veröffentlichen, solange man es unter die selbe Lizenz stellt. Ihr könnt Euch also daran austoben. Aber nicht vergessen: Sobald ihr Manipulationen am System vornehmt oder Befehle mit systemveränderndem Charakter einsetzt, wie zum Beispiel den [https://ss64.com/bash/rm.html rm]-Befehl, kann es je nach Konstellation auch schädlich sein. <b>Ihr benutzt also alle Skripte hier auf eigene Gefahr!</b>
 
+
 
    # Wenn vorherige Abfragen NICHT OK
+
Bei Unklarheiten oder offensichtlichen Fehlern seid Ihr gefragt. Schreibt an die Mailingliste (lug-vs@lug-vs.org) oder fragt an einem unserer Stammtische einen der Autoren direkt. Wir lernen täglich aus unseren Fehlern und voneinander.
    if test $OK -eq 0 ; then
+
 
      WEITER="nein"
+
 
   
+
=== BASH-Script: Dateien/Verzeichnisse aus einer Liste automatisch löschen ===
      # Fehlermeldung betr. spezielles Verzeichnis
+
 
      echo "${i}:"
+
Ab und zu möchte man gerne mehrere Dateien und Verzeichnisse löschen, die in einer einfachen Liste stehen. So kann man z.B. mit dem Befehl ''find'' wie z.B. hier [[Nuetzliche_Scripte#BASH-Script: JPEG EXIF Text schreiben|Kapitel 1.2]] beschrieben einfach in eine [https://wiki.ubuntuusers.de/Shell/Umleitungen/ Datei umleiten] (dazu ''-exec'' einfach durch ''>> ZuLöschendeDateien.txt'' ersetzten). Die Datei kann man schließend komfortabel mit dem Texteditor wie z.B. [https://de.wikipedia.org/wiki/Kate_(KDE) Kate] bearbeiten (einfach Zeilen mit dem Kompletten Verzeichnisnahmen löschen oder hinzufügen). Das Programm wird wieder in eine Datei kopiert die man mit <code>chmod +x LöscheDatenAusDatei.sh</code> ausführbar macht und dann mit Pfadnamen <code>./LöscheDatenAusDatei.sh</code> ausführt.
      echo "***  Vorgang nicht möglich. Berechtigungen überprüfen!"
+
 
      echo
+
'''Achtung:''' Das Programm löscht wirklich alle Daten ohne weitere Nachfrage (sogar komplette Verzeichnispfade). Deshalb unbedingt darauf achten, dass es keine Verzeichnisse des Linux Betriebssystems enthält wie ''/bin'', ''/etc'' und viele mehr!
    fi
+
 
  fi
+
<pre>#!/bin/bash
+
# Löscht Dateien/Verzeichnisse der Datei "ZuLöschendeDateien.txt" ohne Rückfrage final und Endgültig!
  if test "$WEITER" == "ja" ; then
+
#
 
+
# (c) LUG-VS (GPL)
    if test $ECHECK -eq 1 ; then
+
while read zeile ; do
   
+
         echo "*** Lösche Datei/Verzeichnis <$zeile> ohne Rückfrage final und Endgültig! ***"
      # Funktionsaufruf für Extra-Check
+
         rm -rfv "$zeile"
      extracheck
+
done < ZuLöschendeDateien.txt</pre>
 
+
 
    else
+
 
   
+
 
      # Sind Dateien bzw. Verzeichnisse rw?
+
===  BASH-Script: PDF dateien durch verkleinern der Bilder komprimieren ===
      if test -r "$i" -a -w "$i" ; then
+
 
        # Funktion "umbenennen" aufrufen
+
Manchmal möchte man PDF dateien z.B. per eMail versenen, was aber wegen der zu großen gesamtgröße nicht geling. In diesem Fall verwende ich nachfolgendes Script um die diese zu komprimieren.
        umbenennen
+
Evtl. muss noch [https://de.wikipedia.org/wiki/Ghostscript Ghostscript] nachinstalliert werden (z.B. via <code>zypper in ghostscript</code>
      else
+
 
         echo "${i}:"
+
  <pre>#!/bin/bash
         echo "***  Umbenennen nicht möglich. Berechtigungen überprüfen."
+
## PDF-Dateien Komprimieren
        echo
+
# Dateiname: PDF-Komprimieren.sh
      fi
+
# Sysmtax:   PDF-Komprimieren.sh GroßeDatei.pdf KomprimierteDatei.pdf
    fi
+
# (c) LUG-VS (GPL)
  fi
+
if [ $# -eq 2 ] ; then
   
+
     [ ! -f $1 ] && echo "*** Fehler: Quelldatei existiert nicht" && exit
done
+
     [ -e $2 ] && echo "*** Fehler: Zieldatei existiert schon" && exit
+
     echo "Komprimiere Quelldatei <$1> in Zieldatei <$2>"
   
+
    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$2 $1
# Wenn Extra-Check
 
if test $ECHECK -eq 1 ; then
 
   if test $FOUND -eq 1 ; then
 
     echo
 
    echo "*** Die ausgegebenen Namen enthalten unliebsame Zeichen oder ***"
 
     echo "*** liegen in einer anderen Kodierung als UTF-8 / ASCII vor. ***"
 
  else
 
     echo "*** Keine unliebsamen Namen gefunden. ***"
 
  fi
 
  echo
 
  echo "*** chnames.sh - Extra-Check beendet ***"
 
  echo
 
 
# Wenn Check
 
elif test $CHECK -eq 1 -a $ECHECK -eq 0 ; then
 
  echo "*** chnames.sh - Check beendet ***"
 
  echo
 
 
# Wenn Umbenennen
 
 
else
 
else
  echo "*** chnames.sh - Umbenennen beendet ***"
+
    echo -e "*** Fehler: Aufruf via\n$0 OriginalDatei.pdf KomprimierteDatei.pdf"
  echo
+
fi</pre>
fi
+
 
+
 
+
 
# Undo-Skript endgültig schreiben + Berechtigung setzen (rwx------)
+
==Links BASH Programmierung==
if test $USKRIPT -eq 1 -a $CHECK -eq 0 -a $CHANGED -eq 1 ; then
+
 
  echo "$SINHALT" > "${SORT}/chnundo_${DATUM}.sh"
+
Noch ein paar Links, wo man weitere Informationen zur BASH Programmierung findet.
  chmod 700 "${SORT}/chnundo_${DATUM}.sh"
+
 
fi
+
* Einführung in die BASH auf [https://selflinux.org/selflinux/html/bash_basic.html selfLinux.org]
</pre>
+
* Bedienung der BASH auf [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2003/03/Konfiguration-der-Bash Linux-Community.de]
 +
* Einführung in die BASH-Programmierung auf [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2005/02/Einfuehrung-in-die-Bash-Programmierung Linux-Community.de]
 +
* Einführung in die BASH auf [https://www.bin-bash.de/ bin-bash.de] dem Treffpunkt für Linux-Shelluser
 +
* Shell-Workshop, Teil 1: [https://www.linux-community.de/38040 Shell-Skripte selbst schreiben (Teil 1)] in der [https://www.linux-user.de/ LinuxUser]
 +
* Shell-Workshop, Teil 2: [https://www.linux-community.de/38291 Shell-Skripte selbst schreiben (Teil 2)] in der [https://www.linux-user.de/ LinuxUser]
 +
* Shell-Workshop, Teil 3: [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2017/04/Ordnung-schaffen Ordnung schaffen] in der [https://www.linux-user.de/ LinuxUser]
 +
* Linux User Artikel [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2000/12/Teil-1-Grundlagen-der-BASH Teil 1: Grundlagen der BASH]
 +
* Linux User Artikel [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2001/01/Teil-2-Grundlagen-der-Bash Teil 2: Grundlagen der Bash]
 +
* Linux User Artikel [https://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2001/02/Teil-3-String-Verarbeitung-und-Regulaere-Ausdruecke Teil 3: String-Verarbeitung und Reguläre Ausdrücke]
 +
* String operationen erklärt:
 +
** Im Blog von Christian Hönick, [https://www.christian-hoenick.com/blog/2012/01/06/shell-string-abschneiden-oder-entfernen-teilstring/ Shell: String abschneiden oder entfernen (Teilstring)]
 +
** Auf LearnShell.org, [https://www.learnshell.org/de/Basic_String_Operations Basic String Operations] mit der möglichkeit es life auszuprobieren
 +
 
 +
 
 +
 
 +
==Sonstige nützliche Scripte aus dem Internet==
 +
 
 +
Siehe auch Scripte im Artikel [[Backup]]. Bei [https://git.sp-codes.de/Ulfi/my-scripts/src/branch/main Ulf im git] finden sich ebenfalls ein paar scripte.
 +
 
 +
 
 +
===Skript zum Suchen nach Übersetzungen===
 +
Elimar hat ein Script mit dem Namen [https://gitlab.com/riesebie/trans-ask trans-ask] erstellt, mit dem man ein Wort in eine andere Sprache übersetzen kann. Das Besondere ist, daß die Ergebnisse verschiedener Übersetzungsprogramme in Fenstern nebeneinander angezeigt werden.
 +
Zur Zeit werden folgende Sprachpaare unterstützt:
 +
* Spanish <-> German
 +
* English <-> German
 +
* Spanish <-> English
 +
 
 +
Siehe [https://gitlab.com/riesebie/trans-ask GitLab]
 +
 
 +
===Umbenennen von Dateien mit Sonderzeichen in ASCII konforme Namen===
 +
 
 +
[https://pastebin.com/1BYbnzuy chnames.sh] (bzw. auch [https://github.com/neontribe/Shell-tools/blob/master/chnames.sh unter]) von [mailto:conny@supple-pixels.net Conny Faber] ist ein BASH Script zum umbenennen von Dateinamen in eine ASCII basierte Version ohne Sonderzeichen.
 +
 
 +
 
 +
 
 +
----
 +
Zurück zur [[Erste-Hilfe|Linux Hilfeseite]] oder zur [[Hauptseite]]

Aktuelle Version vom 5. Juli 2024, 22:07 Uhr

Nützliche Scripte

Hier werden ein paar nützliche Scripte vorgestellt, die man nach Belieben anpassen kann. Ein Script (eigentlich im deutschen Skript) kennt man am wahrscheinlichsten als Drehbuch-Skript. Im Prinzip ist es aber genau dieses. Es ist ein Drehbuch für Kommandozeilen-Befehle. Befehle auf der Kommandozeile werden wie ein militärischer Befehl auch, ohne weiteres Prüfen ausgeführt, sofern er bekannt und in der Syntax richtig ist! Da somit auch eine komplette Linuxinstallation unbrauchbar gemacht bzw. ohne Rückfrage gelöscht werden kann, sollte der Befehlsgeber die Befehle die er gibt und deren Auswirkungen ganz genau kennen! In Linux (und den anderen Unix ähnlichen Betriebssystemen) ist die Kommandozeile sehr mächtig. Verglichen mit Anweisungen, die jemand auf dem grafischen Desktop umsetzen soll, sind Kommandozeilenbefehle (meist) unabhängig von der Distribution, Version und grafischen Oberfläche. Und somit sind sie, wenn man mit Linux schon länger unterwegs ist ein besseres Werkzeug, wenn man jemandem helfen möchte, der sich in Linux noch nicht so eingearbeitet hat (und vielleicht auch eine andere Distribution oder einen anderen Desktop nutzt, als man selbst).

Ein paar hilfreiche Befehle, so genannte Kommandzeilen-Befehle, finden sich auf der Mini-HowTos-Seite.

Ein Script kann man eigentlich mit jedem Linux Textedior wie z.B. kate, gedit, vi, joe, usw. erstellt werden. Wichtig ist, dass man anschließend Linux mitteilt, dass die Datei ausführbar sein soll. Das macht man mit dem Befehlt chmod und am einfachsten einfach mit dem Parameter +x als ausführbar (englisch executeable) markieren.

Linux benötigt außerdem entweder den absoluten Dateinamen oder das Script muss in einem ausführbaren Verzeichnis stehen, welches man mit echo $PATH anzeigen kann. Dabei werden die Pfade mit ':' getrennt. Normalerweise ist das aktuelle Verzeichnis bei Linux/Unix nicht ausführbar, weshalb man dann das Script mit ./ ausführen kann.

Beispiel Datei xxx.sh

kate xxx.sh 
# => Startet den KDE Texteditor Kate, welcher die Datei 'xxx.sh' im aktuellen Verzeichnis anlegt, wenn man ihn nach dem Sichern verlässt.
chmod +x xxx.sh
# => macht die Datei 'xxx.sh' im aktuellen Verzeichnis ausführbar
./xxx.sh
# => führt die Datei 'xxx.sh' im aktuellen Verzeichnis aus
 


Lizenz:
Alle Scripte mit dem Vermerk GPL ohne Version fallen unter die GPL 2.0. Siehe auch LugVSWiki:Copyright und Vermerk unten auf dieser Seite.


Anlegen von (mehreren) Ordnern / Dateien

Erstellt den Ordner „MeinOrdner“ im aktuellen Arbeitsverzeichnis.

mkdir MeinOrdner 

Erstellt die beiden Ordner „MeinOrdner1“ und „MeinOrdner2“ im aktuellen Arbeitsverzeichnis

mkdir MeinOrdner1 MeinOrdner2

Erstellt folgende Ordner und Unterordner:
Ordner
├── A11
│     ├── AU1
│     └── AU2
└── A12
       ├── AU1
       └── AU2

mkdir -p Ordner/{A11,A12}/{AU1,AU2}

Ordner mit fortlaufender Nummer anlegen im aktuellen Arbeitsverzeichnis:

mkdir 202{0..9}

Legt die Ordner 2020 bis 2029 an.


BASH-Script um farblich markierte Ausgabe von DiskFree zu erstellen

Ein kleine Script welche die Ausgabe des BASH Befehls DiskFree (df) in einer gut lesbaren Form anzeigt und Zeilenweise je nach Füllgrad in % die Farbe von default (grün) in gelb (Alarmpegel) und rot (kritischer Alarmpegel) jeder Zeile anpasst. Damit ist dann schon an der Farbe ersichtlich wenn eine Festplatte voll läuft. Aktuell kennt das Script noch keine Argumente, was ich aber demnächst evtl. noch mal anpasse. Download diskfree.sh @ git.sp-codes.de/Ulfi/my-scripts

#!/bin/bash
#
# df with some options and colored if Alert levels are exceeded
# (c) GPL by Ulf Bartolomäus
VERSION="Version 0.1.1  from 13.02.2021"

# 0.1.1
#	Initial based on whatch_new

MyDfC='df -hTx tmpfs -x devtmpfs'							## df - command - w/o *tenpfs 
MyDfCnN='df -hTx tmpfs -x devtmpfs -x fuse -x nfs4'					## df - command - w/o *tenpfs, fusa and nfs4
#MyDfC="${MyDfCnN}"									## zweite Version statt erste
MyDfAlert1=80                    							## alert level of df
MyDfAlert2=90										## critical alert level of df

## Escape seqences for color
esc=$(echo -en "\033")									## define esc seqence
dick="${esc}[1m"									## define bold seqence
rot="${esc}[1;31m"									## define red seqence
gruen="${esc}[1;32m"									## define green seqence
gelb="${esc}[1;33m"									## define yelow seqence
blau="${esc}[1;34m"									## define blue seqence
lila="${esc}[1;35m"									## define purple seqence
norm=$(echo -en "${esc}[m\017")								## define default seqence

## DiskFree (only if not the same device => uniq check first 40 characters
${MyDfC} | uniq -w40 | while read MyOutput; do						## Execute df and filter doublicates - for each row stored in MyOutput
	MyDfUsage=$(echo ${MyOutput} | awk '{ print $6}' | cut -d'%' -f1 )		## Search Usage in %
    if [[ ! $( echo "${MyDfUsage}" | grep [[:digit:]] ) ]] ; then			## If first row
        echo -e ${dick}"${MyOutput}"${norm}						## Echo in bold
    elif [ $(( ${MyDfUsage} )) -ge ${MyDfAlert2} ]; then				## If critical level excided
        echo -e ${rot}"${MyOutput}"${norm}						## Echo in red
    elif [ $(( ${MyDfUsage} )) -ge ${MyDfAlert1} ]; then				## If alert level excided 
        echo -e ${gelb}"${MyOutput}"${norm}						## Echo in yelow
    else										## default
        echo -e ${gruen}"${MyOutput}"${norm}						## Echo in green
    fi
done

BASH-Script: JPEG EXIF Text schreiben

Dieses ist ein BASH-script welches ab dem aktuellen Verzeichnis, alle Unterverzeichnisse rekursiv nach einem Dateifilter (hier *.jpg) durchsucht. Auf alle gefundenen Dateien (also keine Verzeichnisse die auf den Filter passen) wird dann das Tool exiftran angewendet. Dieses überschreibt den Bildkommentar mit dem angegebenen Text. Achtung der bisher dort stehende Kommentar geht wirklich verloren, da dieser überschrieben wird. Damit es aber kein böses Erwachen gibt, wird von jeder geänderten Datei eine Kopie mit der ~ am Ende erstellt (also aus xx.jpg wird xx.jpg~). Wenn man sich sicher ist, dass man keine Kommentare überschreibt, kann man natürlich die Option -b bei exiftran weglassen und damit den Inhalt überschreiben. Das würde ich aber nicht empfehlen, sondern bei Bedarf lieber die Sicherheitskopien mit rm -irf "*~" löschen.

Achtung: Der Befehl rm -rf * löscht inklusive des aktuellen Verzeichnisses, alle Unterverzeichnisse und deren Dateien ohne weitere nachfrage. Deshalb muss der Stern (*) und die Tilde (~) immer direkt aneinander hängen und idealer weise auch noch mit dem Anführungszeichen (") umschlossen werden, damit sie zu einem Suchfilter zusammen gefasst werden! Der Stern (*) ist auf der Kommandozeile ein Platzhalter für alle Zeichen in jeder beliebig häufigen Wiederholung! Sicherheitshalber habe ich mal den Prameter -i ergänzt der noch mal nachfragt (siehe auch man rm).

Das Script wird auf der Kommandozeile mit dem Kommentartext als Parameter, am besten in Anführungszeichen, gestartet (nur wenn es in einem Verzeichnis aus PATH steht -> Anzeige mit echo $PATH, ansonsten muß natürlich der komplette Pfad mit angegeben werden): make_exif-name.sh "© Ulfi".

Alternativ kann man auch andere Tools zum lesen und schreiben von EXIF-Kommentaren verwenden. Folgende Befehle zeigen den EXIF-Kommentar an

exiftool -a -u Bild.jpg | grep Comment
convert Bild.jpg -format "%c\n" info:
identify -verbose Bild.jpg | grep comment:

Folgende Befehle schreiben den EXIF-Kommentar

exiftran -ibp -c "Kommentar" Bild.jpg
convert Bild.jpg -set comment "Kommentar" BildOut.jpg

Script mit Programm EXIFtran als Beispiel: (Download make_exif-name.sh @ git.sp-codes.de/Ulfi/my-scripts)

#!/bin/bash
# Add a exif-comment to all JPEG-Files from this directory and all subdirectorys
#
# (c) LUG-VS (GPL)
VERSION="make_exif-name.sh Version 0.0.2 from 23.10.2005"
#
# Input:	comment text
# Output:	changed files
#
# Changes:
#	0.0.2:		comment as parameter from commandline
#	0.0.1:		generation
#

COMMENTSTEXT=$*
JPEGFILEFILTER=*.jpg

# trap is executed if script breaks
trap "echo '*** TRAP ***' ; exit" ERR

# check if command exists else break
which exiftran > /dev/null || echo "exiftran not found!" || exit;

echo "Write Comment: <"${COMMENTSTEXT}">"
# for each file in JPEGFILEFILTER do
# 	exiftran - transform digital camera jpeg images and use the libexif-Library
#		-i				Enable  inplace  editing of the images.
#		-b				Create a backup file when doing inplace editing.
#		-p				Preserve timestamps (atime + mtime) when doing inplace editing.
#		-c <text>		Set jpeg comment tag to <text>.
find . -type f -name "${JPEGFILEFILTER}" -exec exiftran -ibp -c "${COMMENTSTEXT}" {} \;


BASH-Script: EXIF-Kommentar in Bild einblenden

Möchte man den EXIF-Kommentartext in die Bilder selber schreiben, um diese beim Betrachten jederzeit kenntlich zu haben, gibt es viele Möglichkeiten. Einige sind z.B. in ImageMagic Paket vorhanden und können dort vielfältig genutzt werden. Eine Übersicht der ImageMagic Möglichkeiten Text in Bilder zu Schreiben findet sich z.B. hier (in englisch).

In Obigen script haben wir gelernt wie man EXIF-Kommentare in ein Bild Schreibt. In diesem script lesen wir diese wieder aus und schreiben sie in das Bild selbst, damit man es immer sehen kann. (Download write-exif-comment.sh @ git.sp-codes.de/Ulfi/my-scripts)

#!/bin/bash
# Write a exif-comment to all JPEG-Files from this directory and all subdirectorys
#
# (c) LUG-VS (GPL)
VERSION="write-exif-comment.sh Version 0.0.1 from 16.06.2019"
#
# Input:	InImage [OutImage]
# Output:	changed files
#
# Changes:
#	0.0.1:		generation
#
test -e $1 || exit -1
FilenameFull="$1"
if [ $# -gt 1 ] ; then
    FilenameSik="$2"
else
    Extension="${FilenameFull##*.}"
    FilenameBase="${FilenameFull%.*}"
    FilenameSik="${FilenameBase}New.${Extension}"
fi
CommentsText="$(convert ${FilenameFull} -format "%c\n" info:)"
Width=$(identify -format %w ${FilenameFull})
High=$(( $(identify -format %h ${FilenameFull}) / 10))
echo "EXIF-Kommentar= <${CommentsText}> of <${FilenameFull}> (${Width}x${High} ${FilenameSik})"
convert -background '#0008' -fill white -gravity center -size ${Width}x${High} caption:"${CommentsText}" \
          ${FilenameFull} +swap -gravity south -composite  ${FilenameSik}


BASH-Script: Download von durchnummerierten Dateien

Manchmal möchte man einige Dateien mit durchlaufender Nummer von z.B. 01 bis 99 (also mit führender Null) durchnummeriert downloaden oder in einem Script anders verarbeiten. Setzt man aber ein Bash-Variable direkt ein, so erhält man 1 statt 01. Im nachfolgenden Script habe ich mal sowas umgesetzt (ich möchte nicht ausschließen das es auch einen eleganteren Weg gibt).

Das Script selber ist eigentlich recht simpel. Zunächst werden einige Variablen vorbelegt. Im Beispiel wird z.B. ein Proxy gesetzt, z.B. um einen Werbeblocker oder einen Anonymisierungsdienst dazwischen zu schalten. Anschließend wird in das Zielverzeichnis gewechselt. Nun startet eine for-Schleife welche die Variable NR hochzählt. Innerhalb der Schleife werden dann mit Hilfe einer arithmetischen Operation zunächst die Einer- und Zehner-Werte ermittelt. In der Bash wird eine arithmetischen Operation mit einem $ eingeleitet und innerhalb einer doppelten runden Klammer eingefasst z.B. $((567 / 10)). Diese ersetzt dann die Berechnung durch das Ergebnis, im Beispiel wird also $((567 / 10)) durch 56 ersetzt (also eine Integerzahl oder ganze Zahl). Sind nun die Zehnerpotenzen separiert, so können sie wie im Beispiel mit dem Download Tool wget verwendet werden. Dieses lädt die Datei (notfalls auch in mehreren Versuchen) über den Proxy ins lokale Verzeichnis. Sind alle Dateien geladen, wird die Schleife beendet und wieder zurück in das ursprüngliche Verzeichnis gewechselt.

#!/bin/bash
# (c) LUG-VS (GPL)
# Set Variables
export http_proxy=https://proxy.homenetz.de:1234/                 # Set an Proxy
# Change to destination path
cd ${HOME}/MyDestinationPath
# Do for every Number from 1 to 99
for (( NR=1; $NR < 100; NR=$NR+1 )); do
        # Calkulate exponents (10^1 and 10^0)
        ZNR=$((${NR}/10))
        ENR=$((${NR}-$((10*${ZNR}))))
        # Echo and download the file with the number and save to an other name
        echo -e "\twget --proxy=on -c ftp://tst.de/path/File${ZNR}${ENR}.Ext -O Datei${ZNR}${ENR}.Ext\n"
        # download over proxy the file (option -c says repeat and reconect the download)
        wget --proxy=on -c ftp://tst.de/path/File${ZNR}${ENR}.Ext -O Datei${ZNR}${ENR}.Ext
        if [ "$?" -ne 0 ]; then
            # Delete the File if an error before and file exists
            test -e Datei${ZNR}${ENR}.Ext && rm Datei${ZNR}${ENR}.Ext
       fi;
done;
# Go back in the last path
cd -


Anmerkung/Update

Einfacher kann man mit folgender Funktion pad aus dem UbuntuUsers Forum führende Zeichen ergänzen. Die dort verwendeten Stringoperatoren (die Zahlen nach dem Doppelpunkt) sind z.B. im Linux User Artikel Teil 3: String-Verarbeitung und Reguläre Ausdrücke erklärt. Nachfolgend ein kleines Script welches die pad funktion benutzt und sie z.B. als pad.sh zur Verfügung stellt.

#!/bin/bash
# Script zum füllen von
# https://forum.ubuntuusers.de/topic/bash-variablengenerierung-mit-fuehrenden-nulle/

pad() {
        local s=$1 c=${2:-0} p=${3:- }
        while [ ${#s} -lt $c ] ; do s="${p:0:$c - ${#s}}$s" ; done
        echo "$s"
}

#pad 1 3
# -> "  1"

#pad 123 5 0
# -> "00123"

#pad xyz 5 abc
# -> "abxyz"


if [ $# -eq 3 ] ; then
        pad $1 $2 $3
else if [ $# -eq 2 ] ; then
        pad $1 $2
else
        echo -e "\n*** Error 255: wrong number of Parameter - use $0 <value> <no digits> [fill character]\n" 1>&2
        exit 255
fi fi


BASH-Skript: konvertiert Textdateien in utf8 CharSet

Das nachfolgendes Skript konvertiert eine Textdatei von einem anderen Zeichensatz (CharSet) in den Unicode (utf8). Dabei versucht es selbstständig den vorherigen Zeichensatz herauszufinden. Um Datenverlust zu vermeiden wird die Datei zuerst in eine Sicherheitskopie umbenannt (mit der "~" =Tilde als letztes Zeichen, wie das viele UNIX Editoren auch machen). Hat das Skript die Konvertierung abgeschlossen, schreibt es das bearbeitete (konvertierte) Ergebnis in den Original-Dateinamen zurück. Allerdings muss man dann selbst prüfen, ob man mit dem Ergebnis der Bearbeitung zufrieden ist. Ansonsten kann man das Ergebnis ja löschen und die Datei wieder mit dem vorherigen Namen benennen. (Download utf8.sh @ git.sp-codes.de/Ulfi/my-scripts)

#!/bin/bash
# Script wich converts a file in 'text/plain' from an not utf8 char set to utf8 char set
#
# (c) LUG-VS (GPL)
VERSION="$0 Version 0.1.0 from 20.09.2006"


#
if [ "$1" == "" ]; then
        echo "Please enter Filename as first option which should be converted"
        echo
        echo -e "INFO:\n\tTo convert all old latin1 file-names in new utf8 file-names use:"
        echo -e "\t\t'convmv --notest -r -f latin1 -t utf-8 *'\n"
        exit -1
fi

myNEWNAME=$1
myNEWNAMEsik=$(echo ${myNEWNAME}~)
myFILETYPE=$(file -bi ${myNEWNAME} | cut -d';' -f1)
myCHARSET=$(file -bi ${myNEWNAME} | cut -d'=' -f2)
# if Filetype is convertable
if [ "${myFILETYPE}" == "text/plain" ] && [ "${myCHARSET}" != "utf8" ]; then
        # If sik file exists break with error message
        test -e  ${myNEWNAMEsik} && echo "File <${myNEWNAMEsik}> exists" && exit -2
        mv ${myNEWNAME} ${myNEWNAMEsik}
        # Convert the old CharSet in utf8
        echo "Convert ${myNEWNAME} from ${myCHARSET} to utf8"
        iconv -f ${myCHARSET} -t utf8 -o ${myNEWNAME} ${myNEWNAMEsik}
else
        # Print error Message
        echo "Filetype not 'text/plain' (${myFILETYPE}) or char set is 'utf8' (${myCHARSET})"
fi


BASH-Skript: konvertiert Dateien von z.B. WMF in z.B. SVG

Ab und zu möchte man Dateien, welche in irgend einem Grafikformat vorliegen, in ein anderes konvertieren. Dieses gelingt mit den Programm convert aus dem ImageMagick® Paket recht einfach. Eine Liste der unterstützten Formate findet man auf dieser Seite: https://www.imagemagick.org/script/formats.php. Dieses Skript definiert am Anfang das Quellformat in der Variablen FORMATin und das Ausgabeformat in der Variablen FORMATout. Durch Anpassen der entsprechenden Datei-Enden aus der Formatliste von ImageMagick® sollte man einen beliebigen Konverter bauen können. In den Zeilen welche zwischen echo -e und >> `echo ${TEMPfile}` das eigentliche Bearbeitungs-Skript generieren, können natürlich beliebige Ergänzungen eingebracht werden. Aber Achtung, man kann hier natürlich auch sehr viel falsch machen. Deshalb sollte man zunächst neue Befehle mit einem echo davor zunächst mal ansehen, bevor man sie dann durch das Entfernen von echo tatsächlich verwendet. Auch ein temporäres Verzeichnis mit kopierten Beispieldateien kann ganz hilfreich sein.

Benutzt wird das Skript, nachdem man die nachfolgenden Zeilen in eine Datei kopiert. Man öffnet es zum Beispiel mit dem Programm Kate im Zielpfad auf der Kommandozeile, bzw. im Terminal mit kate wmf2sfg.sh. Dann wird das Skript per copy & paste (Kopieren und Einfügen = Strg+C und danach Strg+V) in der leeren Datei abgespeichert. Die erzeugte Datei wmf2sfg.sh wird nun noch ausführbar gemacht - z. B. im Terminal mit chmod +x wmf2svg.sh. Das geht bei den meisten Distros aber auch grafisch im jeweiligen Dateimanager, indem man mit einem Rechtsklick auf die Datei in das Menü Eigenschaften gelangt und danach einen Haken im Feld Ausführbar (unter dem Reiter Berechtigungen) setzt. Aufgerufen ohne Parameter konvertiert das Skript alle Dateien mit FORMATin (bzw. des dort angegebenen Dateityps, bzw. der Dateiendung) aus dem aktuellen Verzeichnis und allen Unterverzeichnissen, in das Ausgabeformat FORMATout (bzw. des dort angegebenen Dateityps, bzw. der Dateiendung). Als Parameter kann man aber auch den Pfad direkt angeben, von dem aus das Skript alle Dateien, sowie diejenigen aus den Unterverzeichnissen konvertiert. (Download wmf2svg.sh @ git.sp-codes.de/Ulfi/my-scripts)

#!/bin/bash
# Simple script to "convert" a grafik file format to an other
#
# (c) LUG-VS (GPL)
VERSION="wmf2svg.sh Version 0.0.2 from 2006-12-27"
#
# Input:        path
# Output:       changed files
#
# Changes:
#       0.0.2:          rebuild with temporary convertion file
#       0.0.1:          generation
#

FORMATin=.wmf
FORMATout=.svg
TEMPfile=`dirname $0`/$$.sh
EXECpath=.

# trap is executed if script breaks (remove temporary file if exists)
trap "echo '*** TRAP ***' ; test -e ${TEMPfile} && rm ${TEMPfile} ; exit" ERR

# check if command exists else break
which convert > /dev/null || echo "convert not found!" || exit;

# check if filename exists
if [ -e ${TEMPfile} ] ; then
	echo '${TEMPfile} exists => call this comand a 2-nd time'
	exit
fi

# if path exists and is a path => use it
if [ -d $1 ] ; then
	EXECpath=$1
fi

# generate temporary script for manipulation and made it executable
# change in this sektion what is to do
# the "echo" comand writes the comand lines in the ${TEMPfile}
echo '#!/bin/bash' > `echo ${TEMPfile}`
echo -e 'myFILEin=$1\nmyFILEout=`dirname $1`/`basename $1 '${FORMATin}'`"'${FORMATout}'"' >> `echo ${TEMPfile}`
echo -e 'echo convert ${myFILEin} ${myFILEout}' >> `echo ${TEMPfile}`
echo -e 'convert ${myFILEin} ${myFILEout}' >> `echo ${TEMPfile}`
echo -e '# write what you want to do without coment char "#" in this line' >> `echo ${TEMPfile}`
echo -e '# rm ${myFILEin} ;# remove "#" befor rm if you want to delete the source' >> `echo ${TEMPfile}`
chmod +x ${TEMPfile}

# echo what is to do
echo 'Start recursive convertion from *'${FORMATin}' in *'${FORMATout}

# find all files (not case sensitive) that matching filter and execut script
find ${EXECpath} -type f -iname "*${FORMATin}" -print0 | xargs -0 -n1 ${TEMPfile}

# debug => remove this line if not need
cat ${TEMPfile}

# remove the temporary script
rm ${TEMPfile}


BASH-Skript: Festplatte sicher löschen

Alternativ: dc3dd

Vielleicht haben Sie schon mal darüber nachgedacht eine Festplatte weiterzugeben, z. B. bei Ebay zu verkaufen. Damit auf diesem Weg nicht auch Ihre persönlichen Daten unbeabsichtigt weiter gegeben werden, sollten Sie deshalb diese Festplatte löschen. Das ist der Sinn dieses Skriptes: es überschreibt die Festplatte in zwei Schritten. Zuerst werden Zufallszahlen auf die gesamte Platte geschrieben und anschließend komplett mit Nullen gefüllt. So können die Daten nicht ohne erheblichen technischen Aufwand wiederhergestellt werden. Für Laien und ambitionierte Hobbytüftler also sicher. Aber Achtung! Bei aktuell recht großen Platten ab mehrere hundert GB, kann das Löschen auch schon mal einen Tag lang gehen! Anmerkung: Die Festplatte sollte entweder zusätzlich in den PC eingebaut sein oder mit Hilfe eines USB- oder eSATA-Anschlusses mit dem PC verbunden werden, damit das funktioniert. Es ist keine gute Idee das mit der /dev/sda1 bzw. /dev/hda1 eines laufenden GNU/LINUX-Systems zu machen!

Es geht aber auch, wenn man dieses Skript auf einen USB-Stick speichert und z. B. ein Live-LINUX von CD / DVD startet und das Skript von dort aus vom USB-Stick aufruft, wenn man z. B. einen Laptop verkaufen möchte ohne die Festplatte zuvor umständlich aus- und wieder einzubauen.

TIPP: Der Aufruf des Skriptes funktioniert nur, wenn man dem Skript als Variable den Pfad zur Festplatte (Device) angibt:

[Skriptname] /dev/sdX

Dabei ist der Name des Skriptes frei wählbar. Ich nenne es z. B. SchredderHDD.sh. Der Pfad zur Festplatte richtet sich nach der Festplatte selbst. Also /dev/sda für die erste, /dev/sdb für die zweite, /dev/sdc für die dritte Festplatte im Gerät u.s.w. Aber ACHTUNG! Wer sich nicht absolut sicher ist, das Richtige zu tun, sollte besser jemanden fragen, der sich damit auskennt. Ansonsten bitte die Finger davon lassen! Unwiederbringlich gelöschte Daten sind eben für immer gelöscht! Es darf normalerweise auf den PC keine noch benötigte Platte angeschlossen sein - nur das CD/DVD Laufwerk bzw. der USB Stick (idealerweise schreibgeschützt). Ansonsten löscht man aus Versehen seine noch benötigte Platte! SchredderHDD.sh downloaden

#!/bin/sh
# Löscht ein komplettes Device
# Version 0.1.1
# Vom 2012-10-15
# (c) LUG-VS (GPL)

# teste ob vorhanden
if [ "`whoami`" != "root" ] ; then
	echo 'Nicht ausreichend Rechte - bitte als "root" anmelden!'
	exit  10
fi

# Überprüft ob Parameter vorhanden
if [ $# -lt 1 ] ; then
	echo 'Device angeben z.B. "'$0' /dev/sdf"'
	exit  20
fi

# teste ob vorhanden
if [ ! -b  $1 ] ; then
	echo 'Device existiert nicht'
	echo 'Device angeben z.B. "'$0' /dev/sdf"'
	exit  30
fi

# Device zuweisen
OF=$1

# Letze Nachfrage
echo -n '*** Achtung! Device (Festplatte)' ${OF} 'wirklich löschen? (j/n)'
read key
echo "\n"
if [ "${key}" != "j" ] ; then echo 'Antwort nicht "j" => abgebrochen durch Benutzer'; exit 1; fi;

# Laufwerk aushängen
echo 'Laufwerk aushängen'
umount -f ${OF}*

# Zufallszahlen beschreiben und anschließend löschen
date +"%F %T"
echo 'Schreibe Zufallszahlen auf' ${OF}
dd if=/dev/urandom of=${OF}
echo -en "\n"
date +"%F %T"
echo 'Schreibe Nullen auf' ${OF}
dd if=/dev/zero of=${OF} bs=65536
date +"%F %T"
echo 'Device (Festplatte)' ${OF} 'sicher gelöscht'
OF=

# 4 mal lüten
#for (( INDEX=4 ; ${INDEX} ; INDEX=$(( ${INDEX} - 1 )) )) ; do
#	beep  # => beep wird nicht gefunden ist auch kein alias ???!!!
#	wait
#done
#INDEX=

BASH Skript: Stellt sicher, dass Namen aus einer Datei als Verzeichnis angelegt sind

Dieses Skript hat unser Mitglied Gerhard für seine Auftragsbearbeitung erstellt und uns als GPL zur Verfügung gestellt. Danke dafür an Ihn!

Dieses Skript liest zeilenweise Daten im Format EingabeDatei.txt, in welchen Aufträge in der Formatierung YYANR-Name abgelegt sind. Dabei entspricht YY dem Jahr, ANR der dreistelligen Auftragsnummer und Name dem Namen des Auftrags. Diese Daten werden nach Jahren sortiert und - falls noch nicht vorhanden - als Unterordner neu angelegt. Dabei sollten auch ähnliche Einträge, die schon manuell angelegt wurden, erkannt werden und damit nicht erneut erzeugt werden.

#!/bin/bash
# Loop für jede Zeile einer
while read zeile ; do
  # Einzelne Komponenten aus der Datei 
  JAHR=`echo $zeile | awk '{print substr($1,1,2)}'`
  RNR=`echo $zeile | awk '{print substr($1,3,3)}'`
  TXT=`echo $zeile | awk '{print $2}'`
  # In Zielverzeichnis nach Vorhandensein prüfen
  SUCHSTRING=/home/otto/Auftraege-20${JAHR}/${JAHR}-${RNR}*
  SUCHDIR=`(ls ${SUCHSTRING} | awk '{print $1}')`
  files=$(find ${SUCHSTRING} 2> /dev/null | wc -l)
  # Wenn noch nicht vorhanden, Verzeichnis anlegen
  if [ ! "${files}" != "0" ] ; then
    mkdir "/home/otto/Auftraege-20${JAHR}/${JAHR}-${RNR}-${TXT}"
  fi
done < EingabeDatei.txt



BASH Skript: DynDNS update durchführen

Dieses Skript hat unser Mitglied Gerhard für seine Auftragsbearbeitung erstellt und uns als GPL zur Verfügung gestellt. Danke dafür an Ihn!

Dieses script überprüft, ob die in der Datei /tmp/myip.txt zwischengespeicherte IP Adresse des Routers aus dem Internet, mit der aktuellen (via o-o.myaddr.l.google.com dienst) übereinstimmt. Wenn nicht, wird die neue Adresse in die Datei geschrieben und anschließend mit einem Link die Adresse auf dem DynDNS Server aktualisiert.

Da diese Überprüfung in regelmäßigen Abständen erfolgen sollte, kann man dazu den Linux cron Dienst benutzen. Dieser überprüft jede minute, ob eine Zeile innerhalb der config Datei (früher war das /etc/crontab, welches aber nicht mehr benutzt werden sollte), wird in den ersten fünf mit Leerstelle oder Tab getrennten Zeitangaben geprüft, bis eine mit der aktuellen Uhrzeit übereinstimmt. Ist dieses der Fall, wird der Befehl hinter der Zeitangabe ausgeführt. Die Datei bearbeitet man als "root" Benutzer mit crontab -e oder als normaler Benutzer mit sudo crontab -e. Dort schreibt man dann die folgenden Zeilen hinein (wobei man die mit der # beginnenden Zeilen auch weglassen kann, da diese nur Kommentare für den Bediener sind.


# crontab Datei - Zeit/Datums Format:                                                                                                                                                                          
# mn hr dm mt dw                                                                                                                                                                        
# mn               minute         0-59                                                                                                                                                  
#    hr            hour           0-23                                                                                                                                                  
#       dm         day of month   1-31                                                                                                                                                  
#          mt      month          1-12 (or names, see below)                                                                                                                            
#             dw   day of week    0-7 (0 or 7 is Sun, or use names)                                                                                                                     
# Wenn der Wert keine Rolle spielen soll - wird ein * für die aktuelle Zeit verwendet 

# Nachfolgendes Script alle 10 Minuten aufrufen (aktuelle Zeit geteilt durch 10)                                                                                                                                                                                       
*/10 * * * *    /root/bin/DynDNSupdate.sh &>> /dev/null


Nachfolgend das Script das idealer weise unter dem Namen /root/bin/DynDNSupdate.sh als Benutzer "root" gespeichert werden sollte (also man muss sich erst mit root anmelden (z.B. mit sudo su).


#!/bin/bash
## meine ip herausfinden
myip="$(dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}')";
# Alternativ (Kommentar # for nächster Zeile entfernen)
#myip="$(dig +short myip.opendns.com @resolver1.opendns.com)";

## welche IP war zuvor
while read LINE
do
   alt_ip=$LINE
done < /tmp/myip.txt

## echo Aktuell: $myip Alt: $alt_ip
## sind die IPs gleich?
if [ $myip = $alt_ip ]
then
   echo ist gleich >> /tmp/myiplog.txt
else
   echo $myip > /tmp/myip.txt;
   echo ist anders >> /tmp/myiplog.txt
   curl "http[s]://<hier kommt deine update-query rein>"
fi



BASH Skript: Führt ein komfortables und inkrementelles Backup/Restore aus

Diese Skript benutzt mit Zenity eine graphische Schnittstelle mit der der User einfach und komfortabel Backup/Restore machen kann. Die Ereignisse werden in einer Log-Datei /tmp/backup-restore-de.log erfasst, da für den Ordner /var/log root Zugangsrechte nötig sind.


#!/bin/bash -x             
#--> "-x"-Befehle und ihre Argumente während der Ausführung ausgeben
# (c) LUG-VS (GPL)
#
# Beschreibung:             Führt ein komfortables und inkrementelles Backup aus.
# Zusätzliche Pakete:       Zenity-Library  
# Skript-Name:              backup&restore-de.bash
# Version:                  vom 15.01.2017 (Deutsch)
# Bemerkung:                Bei Dateiname oder Ordnername
#                           darf kein Leerezeichen dazwischen sein
#                           Nur mit Runlevel 5 bzw. xorg ausführbar und
#                           root-Zugriffrechte erforderlich
# Autor:                    Giorgio Giuseppe Codardo (giuseppe.codardo@googlemail.com
#===========================================================================
# Deklaration, Definition und Initialisierung von Variablen.
SOURCE=' '
DESTINATION=' '
typeset -i OPERATION=0
RESULT=' '
typeset -i BYTES=0
DATE=$(date +%d.%m.%Y)
TIME=$(date +%H:%M)
#==========================================================================
#
echo $PATH
#
function verify_exit_status
{
   if [ $? -ne 0 ]; 
   then zenity --error \
               --text="Es ist ein Fehler aufgetreten, deshalb wird dieses Script unterbrochen:\n
                       - Bitte mit anderen Parametern neu starten, \n
                       - oder Debugging verwenden um den Fehler zu suchen."
   exit               
   fi
}
#
#
#==========================================================================
function start_backup
{
SOURCE=$(zenity --file-selection \
                --multiple \
                --directory \
                --title="Quelleverzeichnis wählen ...")
#
# '|' von Zenity wird ' 'ersetzt, so das man in der Kommandozeile für
# cp benutzen kann.
#
SOURCE=${SOURCE//|/' '} 
#
zenity --warning \
       --text="                WICHTIG! \n
                - Externe Festplatte mounten,\n 
                - Bei Home-Verzeichnis: Verlauf löschen und \n
                - Papierkorb leeren, \n
                - Sicherstellen, dass das Dateisystem kompatibel ist."
#
DESTINATION=$(zenity --file-selection \
                     --directory \
                     --title="Zielverzeichnis wählen ...")
#
verify_exit_status
#
# Startet ein inkrementelles Backup
#
cp --archive --update $SOURCE $DESTINATION |
zenity --progress \
       --title="Backup wird ausgeführt" \
       --width=400 --height=200 \
       --text="Bitte warten ..." \
       --pulsate \
       --auto-close 
#
# Hier werden die Bytes ermittelt, die kopiert wurden und
# der Pfad entfernt.
#
RESULT=$(du -bs $SOURCE)
RESULT=${RESULT/'/'/'_'}
BYTES=${RESULT%_*}
#
zenity --info \
       --text="BACKUP erfolgreich ausgeführt!\n 
               Es wurden $BYTES Bytes kopiert/aktualisiert.\n
               Weitere Infos: /tmp/backup-restore-de.log"
}
# End function start_backup
# 
#==========================================================================
#
function start_restore
{      
zenity --warning \
       --text="                WICHTIG! \n
                - Externe Festplatte mounten,\n 
                - Sicherstellen, dass das Dateisystem kompatibel ist."
#
SOURCE=$(zenity --file-selection \
                --multiple \
                --directory \
                --title="Quelleverzeichnis wählen ...")

verify_exit_status
#
SOURCE=${SOURCE//|/' '} 
#
#
DESTINATION=$(zenity --file-selection \
                     --directory \
                     --title="Zielverzeichnis wählen ...")
#
verify_exit_status
#
cp --recursive --force $SOURCE $DESTINATION | 
zenity --progress \
       --title="Wiederherstellung wird ausgeführt" \
       --width=400 --height=200 \
       --text="Bitte warten ..." \
       --pulsate \
       --auto-close 
#
RESULT=$(du -bs $SOURCE)
RESULT=${RESULT/'/'/'_'}
BYTES=${RESULT%_*}
#
zenity --info \
       --text="WIEDERHERSTELLUNG erfolgreich ausgeführt !\n 
               Es wurden $BYTES Bytes wiederhergestellt.\n
               Weitere Infos: /tmp/backup-restore-de.log"
}

# End function start_restore
#==========================================================================
# Main programm
#
# Eingabe für Superuser
# PASSWORD=$(zenity --password)
# echo $PASSWORD | sudo -S su
# "Access Denied !!!"
#
OPERATION=$(zenity --list \
                   --title="Aktion wählen ..." \
                   --width=800 --height=400 \
                   --column="Nummer" --column="Aktion" --column="Beschreibung" \
                     1 Backup "Ausführung eines inkrementellen Backups." \
                     2 Restore "Wiederherstellung aus gesicherten Daten.")

case $OPERATION in
    1)
     start_backup
     echo "Backup wurde am: $DATE um $TIME durchgefürt und $RESULT Bytes gesichert/aktualisiert" \
           >> /tmp/backup-restore-de.log 2>&1
   
     verify_exit_status
    ;;

    2)
     start_restore
     echo "Wiederherstellung wurde am: $DATE um $TIME durchgeführt und $RESULT Bytes gesichert/aktualisiert" \
           >> /tmp/backup-restore-de.log 2>&1
  
     verify_exit_status
    ;;
    
    *)
     verify_exit_status
    ;;
esac
#
exit 0 
#==========================================================================

BASH Skript: Filtert nur die Fehlermeldungen von Log Dateien

Diese Skript benutzt mit Zenity eine graphische Schnittstelle mit der der User einfach eine Suchergebnisse von Log Dateien angezeigt bekommt.

#!/bin/bash -x
#=============================================================================
#
# (c) LUG-VS (GPL)
#
# Beschreibung:                 Filtert nur die Fehlermeldungen von Log Dateien
#                               in /var/log.
# Zusätzliche Pakete:           Zenity-Library
# Skript-Name:                  errorlog-DE.bash
# Version			vom 29.04.2021 (Deuch)
# Letze Änderung:		am  29.04.2021
#
# Autor:			Giorgio Giuseppe Cotardo
#                               (giuseppe.codardo@googlemail.com)
#
#=============================================================================
# Initialisierung und definition von Variabeln
echo $PATH     
RESPONSE=0
RETURN_VAL=0
YES=0
NO=1
#
#=============================================================================
#                                SUCH-FUNKTION
#=============================================================================
function search_error_log
{
SELECTION=$(zenity --list \
                   --title="Option wählen ..." \
                   --width=800 --height=400 \
                   --column="Nr." --column="Datei" --column="Beschreibung" \
                   1 boot "Log von boot" \
                   2 kernel "Log der geladene kernel" \
                   3 system "System log" \
                   4 apport "Log von unerwartete Fehlermeldung" \
                   5 auth "System Anmeldung bzw. Login")
                   
case $SELECTION in
     1)
      grep fail /var/log/boot.log > /tmp/resultlog.txt
      RETURN_VAL=$?
      FILE=/tmp/resultlog.txt
      if [ $RETURN_VAL -eq $YES ]; then
      zenity --text-info \
             --width=800 --height=400 \
             --title="Suchergebnis in der Datei boot.log" \
             --filename=$FILE
	   else
		   zenity --info \
			   --width=400 --height=100 \
			  --text="Kein Suchtreffer."
      fi
      ;;
      2)
       grep fail /var/log/kern.log > /tmp/resultlog.txt
       RETURN_VAL=$?
       FILE=/tmp/resultlog.txt
       if [ $RETURN_VAL -eq $YES ]; then
       zenity --text-info \
              --width=800 --height=400 \
              --title="Suchergebnis in der Datei kern.log." \
              --filename=$FILE
	     else
		     zenity --info \
			     --width=400 --height=100 \
			     --text="Kein Suchtreffer."
       fi
       ;;
       3)
       grep fail /var/log/syslog > /tmp/resultlog.txt
       RETURN_VAL=$?
       FILE=/tmp/resultlog.txt
       if [ $RETURN_VAL -eq $YES ]; then
       zenity --text-info \
              --width=800 --height=400 \
              --title="Suchergebnis in der Datei syslog." \
              --filename=$FILE
	     else
		     zenity --info \
			     --width=400 --height=100 \
			     --text="Kein Suchtreffer."
       fi
       ;;
       4)
       grep fail /var/log/apport.log > /tmp/resultlog.txt
       RETURN_VAL=$?
       FILE=/tmp/resultlog.txt
       if [ $RETURN_VAL -eq $YES ]; then
       zenity --text-info \
              --width=800 --height=400 \
              --title="Suchergebnis in der Datei apport.log." \
              --filename=$FILE
	     else
		     zenity --info \
			     --width=400 --height=100 \
			     --text="Kein Suchtreffer."
       fi
       ;;
       5)
       grep fail /var/log/auth.log > /tmp/resultlog.txt
       RETURN_VAL=$?
       FILE=/tmp/resultlog.txt
       if [ $RETURN_VAL -eq $YES ]; then
       zenity --text-info \
              --width=800 --height=400 \
              --title="Suchergebnis in der Datei auth.log." \
              --filename=$FILE
	     else
		     zenity --info \
			     --width=400 --height=100 \
			     --text="Kein Suchtreffer."
       fi
       ;;
       *)
esac
#
zenity --question \
       --width=400 --height=100 \
 	--text="Mit Suchen fortsetzen?"
RESPONSE=$?
}
#=============================================================================
#                                    MAIN
#=============================================================================
while [ $RESPONSE -eq $YES ]; do
     search_error_log
done
echo $RESPONSE

              
      


BASH Skript: Zerlegt eine komprimierte Datei in gleichem große Teile oder baut eine bereits gesplitterte Datei wieder zusammen

Diese Skript benutzt die graphische Schnittstelle Zenity.

#!/bin/bash -x
#=============================================================================
#
# (c) LUG-VS (GPL)
#
# Beschreibung:             Splittert / zerlegt eine Datei in eine gewünschene
#                           Größe und nach auswahl, verkettenet es in einem 
#                           urprungliche Größe.
#                           Die Datei muß zuerst komprimiert in erlaubte Format
#                           sein: .zip, .tar, .gz, .rar, .xz
#                           Die Dateiname werden mit einem Zufallzahl benannt.
# Zusätzliche Pakete:       Zenity-Library  
# Skript-Name:              split&cat-de.bash
# Version:                  vom Mon 29 Dec 2014 12:06:22 CEST  (Deutsch)
# Letze Änderung:           am   Sa 28 Sep 2019 12:24:11 CEST 
# Bemerkung:                Bei Dateiname oder Ordnername
#                           darf kein Leerezeichen bzw. Sonderzeichen 
#                           dazwischen sein.
#                           Nur mit Runlevel 5 bzw. xorg ausführbar.
# Autor:                    Giorgio Giuseppe Codardo 
#                           (giuseppe.codardo@googlemail.com)
#
#=============================================================================
# Initialisierung und definition von Variabel
echo $PATH
export STATE=0
NEWDIR=$RANDOM
STATUS=$?
ZENITYPATH="/usr/bin/zenity"
INFOFILE="/home/INFO.txt"
#                      
#=============================================================================
#                             FUNKTION SPLIT
#=============================================================================
# Datei wählen ...
function Split()
{
  FILENAME=${FILENAME//' '/'/'}
#
#-----------------------------------------------------------------------------
# Extension der Datei überprüfen gz, tar o tar.gz etc.
#
#-----------------------------------------------------------------------------
ESTENSIONE=${FILENAME:(-3)}

 case "$ESTENSIONE" in

  "zip" )
  STATE=1
  ;;

  "tar" )
  STATE=1
  ;;

  ".gz" )
  STATE=1
  ;;

  "rar" )
  STATE=1
  ;;

  ".xz" )
  STATE=1
  ;;

  * )     # Als default
  STATE=0 # für andere Dateifomat.
  ;;

 esac  


if [ $STATE == 0 ]; then
  zenity --error \
         --text="Eine unkomprimiert Datei wurde gewählt! "
  exit -1
fi
#-----------------------------------------------------------------------------
#  NEWDIR=`date`
#  NEWDIR=${NEWDIR//','/'_'}
#  NEWDIR=${NEWDIR//' '/'_'}

  FILESIZE=$(zenity --scale \
                    --text="Maximale Größe der gespliterte Datei einstellen (in MByte)" \
                    --value=100)

  FACTOR=1000000 # 
  FILESIZE=$((FILESIZE*FACTOR))
  #-----------------------------------------------------------------------------
  # Eine Orden mit gleicher Dateiname erzeugen ...
  #-----------------------------------------------------------------------------
  DESTINATION=$(zenity --file-selection \
                       --directory \
                       --title="Zielordner auswählen ...")

  if zenity --question \
            --text="Eine Zufalldateiname erzeugen?"; then

      mkdir /$DESTINATION/"$NEWDIR"
      cd /$DESTINATION/$NEWDIR
  else
      NEWDIR=$(zenity --entry \
                      --title="Ordnername eingeben." \
                      --text="Eine neue Ordner wird erzeugt" \
                      --entry-text="New Directory")

      mkdir /$DESTINATION/"$NEWDIR"
      cd /$DESTINATION/$NEWDIR

  fi
  #
  # Hier geht's los ...
  #
  split --numeric-suffix --byte=$FILESIZE $FILENAME $NEWDIR"_"
  #
  # 
  zenity --notification\
         --window-icon="Info" \
         --text="I files frazionati si trovano nella directory di destinazione."
}

#=============================================================================
#                             FUNKTION CAT
#=============================================================================
function Cat()
{
  FILELIST=$(zenity --file-selection \
                    --multiple \
                    --title="Alle Datei zum verketten markieren ...")

  FILELIST=${FILELIST//'|'/' '}


 DESTINATION=$(zenity --file-selection \
                      --directory \
                      --title="Ziel Ordner wählen ...")
  OUTPUTFILE=$(zenity --entry \
                      --title="Datename mit entprechend extension eingeben ..." \
                      --text="Neue Dateiname" \
                      --entry-text="*.gz, *.zx, *.zip, *.tar")

  cat $FILELIST > $DESTINATION/$OUTPUTFILE
 
  zenity --notification\
         --window-icon="Info" \
         --text="Concatenate erfolgreich ausgeführt und befinden sich in  \
      $OUTPUTFILE."
}
#=============================================================================
#                               MAIN 
#=============================================================================
while 
     # Prüfen ob zenity installiert ist ...
     find $ZENITYPATH
     if [$STATUS = 1]
     then 
        echo "Zenity nicht gefunden!"
     fi        
 
      zenity --question \
             --text="Weiter mit dem Script?" ; do
      
      
      zenity --text-info \
             --title="Informationen" \
             --filename=$INFOFILE \
             --checkbox="Einverstanden!"

     # Die Rückgabewert entspricht die string von split&cat
      RESULT=$(zenity --list \
                      --title="Gewünschene operation wählen:" \
                      --column="Operation" --column="Beschreibung" \
                      SPLIT "Splittert in gleichem Größe" \
                      CAT "Verketten die gesplitterte Datei" )

      if [ $RESULT = "SPLIT" ]
          then FILENAME=$(zenity --file-selection \
                                 --title="Datei auswählen")
               Split # Function Call
          else
               $RESULT = "CAT"
               Cat  # Function Call
      fi
done        
exit 0
#=============================================================================

Einfache Frontend für GnuGPG

Diese Skript benutzt die graphische Schnittstelle Zenity.

#!/bin/bash
# -x stehet für Debugging.
#
# (c) LUG-VS (GPL)
#
# Titel:                    Einfache GPG-Frontend
# Verwendete Library:       Zenity-Library (GTK).  
# Scriptname:               gpg-V2-DE.bash
# Erstellt am:              16.07.2023
# Author:                   Giorgio Giuseppe Codardo            
#                           giuseppe.codardo@googlemail.com
# Co-Author:                Uwe S., Julian
#---------------------------------------------------------------------------
# Letzte Update:            23.07.2023 - WICHTIG!.
#---------------------------------------------------------------------------
# Warnungen:                Die Ordner dürfen keine Leerzeichen erhalten. 
#                           Ein verlorener Schlüssel, kann Datenverlust
#                           verursachen. 
#                           Zuerst testen!
# Beschreibung:                                                 
# Der Anwender dieses Scripts muss bereits einen Schlüssel
# besitzten.                          
# Dies wird durch das Kommando "gpg --gen-key" ausgeführt und
# der Schlüssel sollte in dem Schlüsselanhänger (z.B.Seahorse) gespeichert sein.  
# Beispiele:
# gpg --gen-key    // Wird einen privaten Schlüssel erzeugen.
# gpg -e -r $(whoami) filename.txt   // Wird die Datei filename.txt.gpg erzeugt.
# gpg --output neuename.txt --decrypt filename.txt.gpg // Datei entschlüsseln.
# Der Pfad in WORKSPACE und TRASH funktiiniertnur für den eigenen Benutzer-Namen.
# Um der Schlüssel zu importieren, einfach der Datei asc su /home/$(whoami)/
# .gnupg kopieren.
# 
#===========================================================================
echo $PATH
# 
WORKSPACE="/home/$(whoami)/Desktop" # Standard Pfad. Abfrage folgt ...
TRASH="/home/$(whoami)/.local/share/Trash/files"
EXEC=0 # 
COUNT=0 # Zähler der Script-Wiederholungen.
#
#===========================================================================   
# Die Befehlen werden nach Fehler geprüft. Ist der Fall, wird der Vorgang
# abgebrochen.
function check_error
{
  if [ $? -ne 0 ]; then
   zenity --error \
          --width=400 --height=200 \
          --text="Ein Fehler ist aufgetreten: Das Script wird abgebrochen!" 
   exit -1
  fi
#   
}
    WORKSPACE=$(zenity --file-selection \
                       --directory \
                       --multiple \
                       --title="Schreibtisch wählen.")
                       # 
                       check_error

cd $WORKSPACE
#===========================================================================   
# 
#___________________________________________________________________________
while [ $EXEC != 1 ]; do

if [ $COUNT -eq 0 ]; then
zenity --warning \
       --width=400 --height=200 \
       --text="Warnung! Zuerst einen gpg-Schlüssel besitzen.\n
               Dateien und Ordner ohne Leerezeichen verwenden."
       
fi
CHOOSE=$(zenity --list \
                --title="Die Operation zum Ausführen wählen ..." \
                --width=800 --height=400 \
                --column="Pos." --column="Operation" --column="Beschreibung" \
                  1 encrypt "Dateien / Ordner verschlüsseln" \
	          2 decrypt "Entschlüsseln eines tar Archiv.")
	          check_error

if [ $CHOOSE -eq 1 ]; then
       NAME=$(zenity --entry \
                     --title="Schlüsselname." \
                     --text="Scheiben Sie den Namen eines Schlüssels" \
                     --entry-text="Key")
                     check_error                  

       SOURCE=$(zenity --file-selection \
                       --directory \
                       --multiple \
                       --title="Dateien / Ordner zum archivieren wählen.")
                       # --directory # nur für Dateien.
                       check_error
       SOURCE=${SOURCE//|/' '} # Das Symbol '|' (pipe) durch ' ' (space) ersetzten.

       # 
       FILE_ARCH=$(zenity --entry \
                          --title="Archiv wird erzeugt." \
                          --text="Dateiname mit der Extension .tar schreiben." \
                          --entry-text="File.tar")
                          check_error
                     
       tar --create --file $FILE_ARCH $SOURCE 
       #
       #     zenity --progress \
       #            --title="Erzeugung des Archivs wird ausgeführt..." \
       #            --width=400 --height=200 \
       #            --text="Warten ..." \
       #            --pulsate \
       #            --auto-close  
       check_error    
       # Hier wird das erzeugte Archiv verschlüsselt.
       gpg --encrypt --recipient $NAME "$FILE_ARCH" 
       #| 
       #            zenity --progress \
       #            --title="Verschlüsselug wird ausgeführt ..." \
       #            --width=400 --height=200 \
       #            --text="Warten ..." \
       #            --pulsate \
       #            --auto-close  

       check_error

       # 
       mv --force $FILE_ARCH $TRASH
       check_error

       zenity --notification \
              --window-icon="Info" \
              --text="Verschlüsselung war erfolgreich!"
fi
#___________________________________________________________________________
# Hier wird die verschlüsselte Datei entschlüsselt.
if [ $CHOOSE -eq 2 ]; then
          NEW_FILE=$(zenity --entry \
                            --title="Neu Archiv." \
                            --text="Schreiben Sie den Namen der neuen Archiv-Datei mit Extension." \
                            --entry-text="new-file.tar")
                            check_error

            SOURCE=$(zenity --file-selection \
                            --multiple \
                            --title="Datei/en zum entschlüsseln wählen...")
                            check_error
        SOURCE=${SOURCE//|/' '}
#
        gpg --output $NEW_FILE --decrypt "$SOURCE" 
        check_error
#
zenity --notification \
       --window-icon="Info" \
       --text="Die Datei wurde erfolgreich entschlüsselt!"
#___________________________________________________________________________
zenity --question \
       --text="Dateien von Archiv extraieren?"

       if [ $? -eq 0 ]; then
 
                FILE=$(zenity --file-selection \
                              --title="Datei mit *.tar wählen.")
                              check_error
 
#
                tar --extract --file $FILE -C /tmp 
                check_error                       

                zenity --notification \
                       --window-icon="Info" \
                       --text="Entpacken der Datei wurde erfolgreich durchgeführt.\n
                       Die Datei befindet sich im /tmp Ordner \n
                       Archiv vom Scheibtisch manuell löschen!" 
       fi   
fi
let COUNT=COUNT+1
zenity --question \
       --text="Mit dem Script fortsetzen? \n (Times = $COUNT)"
       EXEC=$?
done # 
exit 0 # 
#===========================================================================


Anmerkung

Anstatt des auf 'GTK' basierenden Zenity kann man natürlich auch das Qt/KDE-Pedant KDialog verwenden. Siehe auch:

BASH Skript: Führt ein komplettes Backup Deines 'Thunderbird' aus

aktualisiert am 22.05.2021

Hier ein ganz einfaches Skript, das den eigenen .thunderbird-Ordner in einen Backup-Ordner (komprimiert) sichert. Das kann man noch optimieren, erweitern und auch automatisieren, wenn man will. In meinem Fall, genügt mir diese einfache Variante, weil ich es bewusst nach einzelnen Aktionen wie dem massenhaften Abrufen zahlreicher Mailkonten manuell einsetze. Es werden auch die Kalendereinträge im Kalendermodul ('Lightning') mit gesichert, wenn man dies benutzt. Dieses Skript setzt folgendes voraus: Ein Verzeichnis namens 'bin' und ein Verzeichnis mit dem Namen 'backup' im eigenen HOME-Verzeichnis sind vorhanden:

cd
mkdir bin backup

Das Skript muss in 'bin' abgespeichert werden. Der Name ist frei wählbar, ich habe es 'tbbup' (Thunderbird Backup) genannt. Es muss nach dem Erstellen noch ausführbar gemacht werden:

cd bin
chmod u+x tbbup

Sobald man sich auf einer Konsole (Terminal) neu anmeldet, sollte bei einer Standard-Distribution wie z. B. Debian die Ausführung einfach durch die Eingabe von

user@localhost ~ $ tbbup

starten. (Hier bitte nur das fett Gedruckte eingeben. Der vorausgehende Teil ist der Prompt!) Wenn Thunderbird läuft, wird das Programm (Thunderbird) beendet.

Hintergrund: Wenn Thunderbird gestartet ist, sollte man kein Backup machen, damit die Wiederherstellung überhaupt möglich wird. Bei laufendem TB existiert nämlich eine Lock-Datei, die einen Zeitstempel enthält. Die Datei wird beim Beenden gelöscht. Stellt man ein im laufenden Betrieb gesichertes TB später wieder her, macht diese Lock-Datei Probleme und TB kann anschließend nicht gestartet werden.

Sollte Thunderbird nicht laufen, wird die Sicherung sofort ausgeführt.

#!/bin/bash
# name of script: tbbup - Thunderbird Backup-Script
# license: GPLv2 or higher
# author: u.stippekohl@sophtwearteam.de
# date of first creation: 12/05/2015 (Dec. 5, 2015)
# should do the following:
# check if thunderbird is running and stop it if so
# than create a tar.gz-file named 'tb_[date]_[time].tar.gz in a directory 
# named 'backup' in your home-directory
# 
killall -i thunderbird
tar cvfz ~/backup/tb_$(/bin/date +%F_%H:%M).tar.gz ~/.thunderbird/* 

exit 0

Hinweis: Beachte bitte, dass die Wiederherstellung über das tar-Kommando auf den versteckten Ordner .thunderbird in Deinem HOME-Verzeichnis funktioniert:

tar -xzvf backup/tb_[YYYY-MM-DD_hh:mm].tar.gz .thunderbird

Mit absoluten Pfaden:

tar -xzvf /home/[username]/backup/tb_[YYYY-MM-DD_hh:mm].tar.gz /home/[username]/.thunderbird

wobei der Teil [YYYY-MM-DD_hh:mm] mit den tatsächlichen Werten für Datum und Uhrzeit ersetzt werden muss! Deshalb bitte nicht vergessen, dass vor dem 'thunderbird' ein Punkt sitzt:

.thunderbird

Der absolute Pfad wäre in diesem Fall also: '/home/[Dein Benutzername]/.thunderbird'.

BASH Skript: SYSInfo zum üben

Dieses Skript ist nur zu Übungszwecken. inxi leistet hier wesentlich mehr und bessere Arbeit. Auch grafische Tools wie die Systemüberwachung sind sicherlich besser und übersichtlicher. Aber um zu verstehen, wie Skripte arbeiten und funktionieren und um einfach mal mit dem Skripten anzufangen, ist das eine gute Übung.

#!/bin/bash
# name of script: sysinfo
# license: GPLv2 or higher
# author: u.stippekohl@sophtwearteam.de
# date of first creation: 04/29/2017 (Apr. 29, 2017)
# should do the following:
# output a salutation, introduce the hostname, display date
# and time as well as the kernel version used and a final
# salutation at the end.
# Please consider to play with it and insert your own
# commands you are interrested in like e. g.
# cat /etc/debian_version; df -h ~; ls
echo "Welcome $(whoami)"
echo "My name is '$(hostname)'"
echo "The date and time is $(date)"
echo "My kernel version is $(uname -r)" 
echo "Thank you for using sysinfo-script."
echo "Good bye!"

Da dieses Skript unter der GPL v2 steht, darf man es verwenden, ändern und wieder weitergeben / veröffentlichen, solange man es unter die selbe Lizenz stellt. Ihr könnt Euch also daran austoben. Aber nicht vergessen: Sobald ihr Manipulationen am System vornehmt oder Befehle mit systemveränderndem Charakter einsetzt, wie zum Beispiel den rm-Befehl, kann es je nach Konstellation auch schädlich sein. Ihr benutzt also alle Skripte hier auf eigene Gefahr!

Bei Unklarheiten oder offensichtlichen Fehlern seid Ihr gefragt. Schreibt an die Mailingliste (lug-vs@lug-vs.org) oder fragt an einem unserer Stammtische einen der Autoren direkt. Wir lernen täglich aus unseren Fehlern und voneinander.


BASH-Script: Dateien/Verzeichnisse aus einer Liste automatisch löschen

Ab und zu möchte man gerne mehrere Dateien und Verzeichnisse löschen, die in einer einfachen Liste stehen. So kann man z.B. mit dem Befehl find wie z.B. hier Kapitel 1.2 beschrieben einfach in eine Datei umleiten (dazu -exec einfach durch >> ZuLöschendeDateien.txt ersetzten). Die Datei kann man schließend komfortabel mit dem Texteditor wie z.B. Kate bearbeiten (einfach Zeilen mit dem Kompletten Verzeichnisnahmen löschen oder hinzufügen). Das Programm wird wieder in eine Datei kopiert die man mit chmod +x LöscheDatenAusDatei.sh ausführbar macht und dann mit Pfadnamen ./LöscheDatenAusDatei.sh ausführt.

Achtung: Das Programm löscht wirklich alle Daten ohne weitere Nachfrage (sogar komplette Verzeichnispfade). Deshalb unbedingt darauf achten, dass es keine Verzeichnisse des Linux Betriebssystems enthält wie /bin, /etc und viele mehr!

#!/bin/bash
# Löscht Dateien/Verzeichnisse der Datei "ZuLöschendeDateien.txt" ohne Rückfrage final und Endgültig!
#
# (c) LUG-VS (GPL)
while read zeile ; do
        echo "*** Lösche Datei/Verzeichnis <$zeile> ohne Rückfrage final und Endgültig! ***"
        rm -rfv "$zeile"
done < ZuLöschendeDateien.txt


BASH-Script: PDF dateien durch verkleinern der Bilder komprimieren

Manchmal möchte man PDF dateien z.B. per eMail versenen, was aber wegen der zu großen gesamtgröße nicht geling. In diesem Fall verwende ich nachfolgendes Script um die diese zu komprimieren. Evtl. muss noch Ghostscript nachinstalliert werden (z.B. via zypper in ghostscript

#!/bin/bash
## PDF-Dateien Komprimieren
# Dateiname: PDF-Komprimieren.sh 
# Sysmtax:   PDF-Komprimieren.sh GroßeDatei.pdf KomprimierteDatei.pdf
# (c) LUG-VS (GPL)
if [ $# -eq 2 ] ; then
    [ ! -f $1 ] && echo "*** Fehler: Quelldatei existiert nicht" && exit
    [ -e $2 ] && echo "*** Fehler: Zieldatei existiert schon" && exit 
    echo "Komprimiere Quelldatei <$1> in Zieldatei <$2>"
    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$2 $1
else
    echo -e "*** Fehler: Aufruf via\n$0 OriginalDatei.pdf KomprimierteDatei.pdf"
fi


Links BASH Programmierung

Noch ein paar Links, wo man weitere Informationen zur BASH Programmierung findet.


Sonstige nützliche Scripte aus dem Internet

Siehe auch Scripte im Artikel Backup. Bei Ulf im git finden sich ebenfalls ein paar scripte.


Skript zum Suchen nach Übersetzungen

Elimar hat ein Script mit dem Namen trans-ask erstellt, mit dem man ein Wort in eine andere Sprache übersetzen kann. Das Besondere ist, daß die Ergebnisse verschiedener Übersetzungsprogramme in Fenstern nebeneinander angezeigt werden. Zur Zeit werden folgende Sprachpaare unterstützt:

  • Spanish <-> German
  • English <-> German
  • Spanish <-> English

Siehe GitLab

Umbenennen von Dateien mit Sonderzeichen in ASCII konforme Namen

chnames.sh (bzw. auch unter) von Conny Faber ist ein BASH Script zum umbenennen von Dateinamen in eine ASCII basierte Version ohne Sonderzeichen.



Zurück zur Linux Hilfeseite oder zur Hauptseite