Nuetzliche Scripte

Aus lugvswiki
Version vom 9. Juni 2011, 22:02 Uhr von Ulf (Diskussion | Beiträge) (Links zu BASH Artikeln)
Zur Navigation springenZur Suche springen

Nützliche Scripte

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 ~ 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"

#!/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 commandleine
#	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: 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. In 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 vor belegt. Im Beispiel wird z.B. ein Proxy gesetzt, z.B. um einen Werbeblocker oder einen Anonymisierungsdienst zwischenzuschalten. 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 eingefaßt z.B. $((567 / 10)). Diese ersetzt dann die Berechnung durch das Ergebnis, im Beispiel wird also $((567 / 10)) durch 56 ersetzt (also eine Intergerzahl 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 Schluß wird noch mal kurz mit dem Befehl beep Gehupt.

#!/bin/bash
# (c) LUG-VS (GPL)
# Set Variables
export http_proxy=http://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 -
# Make a short beep to sign that the download is ready
beep


BASH-Script: Convertitert Textdateien in utf8 CharSet

Das nachfolgendes Script konvertiert ein Textdateien vom einer 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 muß 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.

#!/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-Script: Convertitert 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 ImageMagick® Paket recht einfach. Eine Liste der unterstützten formate Findet man auf der ImageMagick® Seite mit den unterstützten Formaten. Dieses Script definiert am Anfang das Quellenformat 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-Script generieren, können natürlich beliebige Ergänzungen eingebracht werden. Aber Achtung, man kann hier natürlich auch sehr fiel falsch machen. Deshalb sollte man zunächst neue Befehle mit einem echo davor zunächst mal ansehen, bevor man sie dann tatsächlich durch das entfernen von echo tatsächlich verwendet. Auch ein temporäres Verzeichnis mit kopierten Beispieldateien kann ganz hilfreich sein.

Benutzt wird das Script 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 Scripts in die leere Datei, abspeichern und anschließenden ausführbar machen der generierten Datei (mit chmod +x wmf2svg.sh)). Aufgerufen ohne Parameter konvertiert das Script 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 Script alle Dateien sowie diejenigen aus den Unterverzeichnisse konvertiert.

#!/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-Script: OpenSuSE 10.2 Repositories aktualisieren

Löscht alle OpenSuSE 10.2 Repositories und lege neue Ausgewählte an:

#!/bin/bash
# Remove all Repositorys and generate new selected OpenSUSE 10.2 Repositorys
#
# (c) LUG-VS (GPL)
VERSION="OpenSUSE-10.2-ZEN-Repositorys.sh Version 0.0.3 from 2008-02-05"
#
# Input:        %
# Output:       %
#
# Changes:
#       0.0.3:          add KDE4 Repositorys
#       0.0.2:          with aditional header
#       0.0.1:          generation
#
echo -e "\nShow service list"
rug --debug --no-abbrev  sl
echo -e "\nRemove all repository's"
while [  $? == 0 ] ; do
        rug sd 1;
done
echo -e "\nRefresch Database"
rug ref
echo -e "\nAdd standard OpenSUSE 10.2 repository's"
rug sa http://download.opensuse.org/distribution/10.2/repo/oss/ InstSource -t zypp
rug sa http://download.opensuse.org/distribution/10.2/repo/non-oss/ NonOssInstSource -t zypp
echo -e "\nAdd PackMan repository"
echo -e "\tName: PackMan Project (signing key) <packman@links2linux.de>"
echo -e "\tID: 45A1D0671ABD1AFB"
echo -e "\tFingerprint: F8875B880D518B6B8C530D1345A1D0671ABD1AFB"
rug sa ftp://ftp.gwdg.de/pub/linux/packman/suse/10.2 Packman
echo -e "\nAdd OpenSUSE additonal repository's"
#echo -e "\tName: openSUSE Build Service <buildservice@opensuse.org>"
#echo -e "\tID: 3B3011B76B9D6523"
#echo -e "\tFingerprint: A09B553866A1C4E44EC752953B3011B76B9D6523"
echo -e "\tName: mozilla OBS Project <mozilla@build.opensuse.org>"
echo -e "\tID: 026B47F3766DA614"
echo -e "\tFingerprint: AAA531905D829BDCBE4D5169026B47F3766DA614"
rug sa http://software.opensuse.org/download/mozilla/openSUSE_10.2/ Mozilla
#rug sa http://software.opensuse.org/download/KDE:/KDE3/openSUSE_10.2/ KDE3-Core
#rug sa http://software.opensuse.org/download/KDE:/Backports/openSUSE_10.2/ KDE3-Apps
rug sa http://software.opensuse.org/KDE:/KDE3/openSUSE_10.2/ KDE3-Core
rug sa http://software.opensuse.org/KDE:/Backports/openSUSE_10.2/ KDE3-AppsBack
rug sa http://software.opensuse.org/KDE:/Community/openSUSE_10.2/ KDE3-Community
rug sa http://software.opensuse.org/KDE:/Playground/openSUSE_10.2/ KDE3-Playground
echo -e "\tAdd KDE4 Repositorys"
#rug sa http://software.opensuse.org/download/KDE:/KDE4/openSUSE_10.2 KDE4-102
#rug sa http://software.opensuse.org/KDE:/KDE4/openSUSE_10.2/ KDE4
rug sa http://download.opensuse.org/repositories/KDE:/KDE4:/STABLE:/Desktop/openSUSE_10.2/ KDE4-Core
rug sa http://download.opensuse.org/repositories/KDE:/KDE4:/STABLE:/Extra-Apps/openSUSE_10.2/ KDE4-Extra
rug sa http://download.opensuse.org/repositories/KDE:/KDE4:/STABLE:/Community/openSUSE_10.2/ KDE4-Community
echo -e "\nSubscribe all Repositorys"
rug sub --all
echo -e "\nShow service list"
rug sl
echo -e "\nList available catalogs"
rug ca
echo -e "\nList available updates"
rug lu


BASH-Script: Festplatte sicher löschen

bla blub - mehr Informationen folgen noch!

#!/bin/sh
# Löscht ein komplettes Defice
# Version 0.1.0
# Vom 2009-01-07
# (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 -n 1 key
echo -en "\n"
if [ "${key}" != "j" ] ; then echo 'Antwort nicht "j" => abgebrochen durch Benutzer'; exit 1; fi;

# Laufwerke entmounten
echo 'alle Laufwerke unmounten'
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=


Links BASH Programmierung

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