PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eigene Script-Kreationen



Cyber
04.09.2003, 16:21
HIn und wieder gibt es ja immer wieder Probleme, Aufgaben, Routinen usw. die sich mittel Shell-Script einfacher und bequemer lösen lassen. Der eine oder andere hat sich da mit Sicherheit ja auch schon was gebastelt.
Meine Intension ist die, dies den anderen hier zur Verfügung zu stellen. Vielleicht findet sich dann hier die eine oder andere Lösung für die Community.

Ich mach mal den Anfang und poste hier meine einfache aber schnelle MP3-Verwaltung. Das Script erstellt anhand von mp3-CD's Listen und ermöglicht die Suche nach bestimmten Songs oder Interpreten.

Der Einfachkeit halber (oder eher wegen der Upload-Beschränkung) habe ich das Script mit der Extension .txt versehen.

chb
04.09.2003, 16:26
Gute Idee - Ich werd des wenn das Wiki fertig iss dann auch mal dort unterbringen ..

rup
05.09.2003, 18:52
Find ich eine gute, bei mir haben sich auch ein paar Skripte angesammelt

Wizard
06.09.2003, 16:08
Hi Cybermarc, Gute Idee!
werde auch noch ein paar Scripts veröffentlichen.
Das erste ist das Rotate-Script. Es richtet sich an die Benutzer von Digitalkameras: Die Hochkant-Aufnahmen müssen jeweils um 90° nach rechts gedreht werden (bzw. 270, wenn die Kamera anders herum gehalten wird). Es benutzt das Programm Convert des Paketes Image Magick. Ich habe eine Kamera von Canon, die Dateinamen sehen dort so aus: IMG_0578.JPG. Ich habe ein Script geschrieben, das nur die jeweiligen Nummern der zu drehenden Bilder abfragt (hier: 0578 ), das Bild dann dreht und so lange weiter fragt, bis man 0 eingibt. Welche Bilder gedreht werden sollen, lässt sich mit der Vorschau-Funktion in Nautilus oder Konqueror schnell ermitteln. Das Script ist primitiv aber ich finde es sehr praktisch.

URL: http://mitglied.lycos.de/kriegeronline/scripts

Cyber
09.09.2003, 11:45
@Wizard:
Kling gut, kann ich auch gebrauchen.

@ALL:
ich hab noch zwei Fehler im MP3-Script ausgebessert. Hier die funktionierende Variante.

rup
09.09.2003, 16:46
@wissard


Gute Idee. Man koennte z.B. auch mit identify -size geometry (auch ImageMagick) abfragen ob das Bild auf dem Kopf steht. Natuerlich musste man dann seine bevorzugte Kamera haltung bei Hochformat mit angeben.

Wizard
10.09.2003, 17:43
@rup

Wenn das Script, wie Du es vorschlägst, noch erkennen könnte, ob das Bild hochkant aufgenommen wurde oder nicht, wäre es natürlich so gut wie perfekt.

Leider funktioniert der Identify-Befehl nicht so, wie er soll:
identify -size IMG_0635.JPG
--> identify: Missing geometry (-size).
Beim Aufruf ohne weitere Optionen ergibt sich:
identify IMG_0635.JPG
--> IMG_0635.JPG JPEG 1600x1200+0+0 DirectClass 8-bit 383.1k 0.000u 0:01
Wobei es keinen Unterschied macht, ob das Bild hochkant ist oder nicht.

Es gäbe noch die Möglichkeit, das Programm "exif" zu verwenden. Es liest die Exif-Informationen von Bilddateien aus.
Bei einem Hochkant-Bild sieht das Ergebnis so aus:
exif -t Orientierung IMG_0633.JPG
-->
EXIF entry 'Orientierung' (0x112, 'Orientation') exists in IFD '0':
Tag: 0x112 ('Orientation')
Format: 3 ('Short')
Components: 1
Size: 2
Value: rechts - oben

Bei einem Bild im Querformat so:
exif -t Orientierung IMG_0635.JPG
-->
EXIF entry 'Orientierung' (0x112, 'Orientation') exists in IFD '0':
Tag: 0x112 ('Orientation')
Format: 3 ('Short')
Components: 1
Size: 2
Value: oben - links

Man kann erkennen, dass der entscheidende Unterschied bei der Eigenschaft "Value" liegt. Man könnte diese Zeile mit 'grep' herausfiltern und vom Script auswerten lassen...
Ich arbeite dran.

tr0nix
10.09.2003, 18:12
Mein Bash Menubuilder :)
http://www.secuserv.ch/lowres/main.php?page=software

rup
10.09.2003, 19:19
@ Wizard
ich hab gerade identify getestet, bei mir erkennt er ob das Bild hochkant steht oder nicht. Natuerlich weiss er nicht ob du das Bild um 90 oder 270 Grad drehen musst, aber du weisst ja wie du deine Kamera meisstens haeltst




$ identify -size geometry img_2078.jpg
img_2078.jpg JPEG 1600x1200 DirectClass 8-bit 185kb 0.0u 0:01

rup pc2000 ~
$ gimp img_2078.jpg

rup pc2000 ~
$ identify -size geometry img_2078.jpg
img_2078.jpg JPEG 1200x1600 DirectClass 8-bit 187kb 0.0u 0:01

rup pc2000 ~


Version: @(#)ImageMagick 5.4.4 04/05/02 Q:16

Wizard
19.09.2003, 18:45
DIE LÖSUNG!

Ich fand sie in der aktuellen Ausgabe des Linux User (10/03).
Das Programm jhead kann die Exif-Informationen auslesen und Bilder dementsprechend bearbeiten.
jhead gibt es für Mandrake als Einzelpaket.
Sofern die Kamera erkennt, wie sie gehalten wird, kann man alle Bilder folgendermaßen automatisch drehen:
jhead -autorot *.JPG

Daneben gibt es in dieser Ausgabe noch jede Menge Tips, Skript- und Bedienungsanleitungen; ich kann diese Ausgebe wirklich jedem wärmstens empfehlen, der eine digitale Kamera besitzt und / oder große Mengen an Bildern beareiten und verwalten will.

caba
13.10.2003, 20:15
Mal meine funktionen aus der ~/.bashrc zeig:



function mkiso() {
local ISO_FILE ISO_VOL_ID SOURCE USAGE
USAGE="usage: makeiso ISO_FILE ISO_VOL_ID SOURCE [SOURCE2 SOURCE 3...]"
if [ -z "$1" ]; then
echo -e "${USAGE}"; return 1
fi
ISO_FILE="$1"
ISO_VOL_ID="$2"
shift 2
SOURCE="$@"
mkisofs -J -r -V "${ISO_VOL_ID}" -o "${ISO_FILE}" ${SOURCE}

Klar, ist zum ISOS erstellen.



function burniso() {
local ISO_FILE CDRECORD_ARGS USAGE
USAGE="usage: burniso ISO_FILE"
if [ -z "$1" ]; then
echo -e "${USAGE}"; return 1
fi
ISO_FILE="$1"
CDRECORD_ARGS="-v dev=$CDR_DEVICE speed=$CDR_SPEED driveropts=burnfree -eject"
sudo cdrecord ${CDRECORD_ARGS} -data "${ISO_FILE}"
}

Klar, ISOS auf CD bruzeln



function swatch() {
local USAGE FILE
USAGE="usage: swatch INTERVAL COMMAND"
if [ -z "${1}" ] || [ -z "${2}" ]; then
echo -e "${USAGE}"; return 1
fi
while true; do
clear
echo -e "Every ${1}s: ${2}\t[$(date)]"
eval ${2}
sleep ${1}
done
}


Führt alle "n" Sekunden "command" aus



function untar() {
local USAGE FILE
USAGE="usage: untar FILE [FILE 2] ... [FILE n]"
if [ -z "$1" ]; then
echo -e "$USAGE"; return 1
fi
for FILE in $*; do
tar xvf $FILE
done
}


entpackt *.tar archive



function rot13() {
if [ $# = 0 ] ; then
tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]"
else
tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]" < $1
fi
}


Die gute alte rot13 verschlüsselung...

Hab noch mehr, aber das is mal das wichtigste bzw das nützlichste.
Sind nicht alle von mir

mfg m.w. aus b. bei b. :)

meez
17.10.2003, 12:15
Hier ein XML-Parser.


Er wandelt XML-Tags und Attributte in Variablen um.
Findet er den gesuchten Tag, so wird eine Methode ausgeführt.

Beispiel:


<forums>
<forum type="solaris">
<user id="1">name</user>
</forum>

<forum type="linux">
<user id="2" name="name" />
</forum>
</forums>


Wenn ich jetzt zum Beispiel den User 1 aus dem Solaris-Forum will:
parseXML "/forum/forum[@type=solaris]/user" "methode" "XML-File" (@type='solaris' oder attribute::type='solaris'// Es können auch mehrere Attribute angegeben werden [@atr1='1'][@atr2='2'])

Wenn er beim User ankommt, erstellt der Pasrer folgende Varaiblen und startet dann die definierte Methode:
user=name
id=1

Beim Linux-Forum würde das ganze so aussehen:
parseXML "/forum/forum[@type=linux]/user" "methode" "XML-File"
Folgende Vars werden erstellt:
user=""
id=2
name=name

Der Parser unterstützt auch Wildcards bei Tags:
parseXML "/*/forum[@type=solaris]/user" "methode" "XML-File"




Script-Methode



parseXML() {
#DESc.: XML parsing method
#Interpreter: sh/ksh
#Author: meez
#Version: 1.0
#Date: June 2003
#usage: parseXML <path> <method> <file>
################################################## #####
#set -x
#trap "" 1 2 3
if [ $# -lt 3 ] ; then
echo "XML-Parse-Error: Incorrect argument number"
return 1
fi
if [ " $3 " = " " ] || [ ! -r $3 ] ; then
echo "XML-Parse-Error: No valid input file!"
return 1
fi
SESSION_ID="`echo $$`"
#mkdir -p /tmp 2>/dev/null
rm -f /tmp/sxp-parsed1.$SESSION_ID.tmp /tmp/sxp-parsed2.$SESSION_ID.tmp 2>/dev/null
if [ " $1 " != " / " ] ; then
#parsing path
FULLPATH="`echo "$1" | awk '{print substr($0,2,length())}' | sed 's/\/\//\//g' | sed 's/\[attribute::/:/g' | sed 's/\[@/:/g' | tr -d "]" | tr -d "\'" | tr -d "\""`"
tags="`echo "$FULLPATH" | awk -F/ '{print NF}'`"
LASTTAG="`echo "$FULLPATH" | awk -F/ '{print $'"$tags"'}'`"
fi
sed 's/-->/<\!-- /g' "$3" | sed 's/\"\/>/\" \/>/g' | sed 's/<\!--/<\!-->/g' | tr -d "\t" | tr -d "\n" | tr "<" "\n" | tr ">" "\n" > /tmp/sxp-parsed1.$SESSION_ID.tmp
n=1
SET="true"
COMMENT="false"
#sort out comment
while read entry ; do
#sort out empty entrys
if [ " $entry " = " " ] ; then
continue
fi
#comment end
if [ " $entry " = " !-- " ] && [ " $COMMENT " = " true " ] ; then
SET="true"
COMMENT="false"
continue
fi
#comment start
if [ " $entry " = " !-- " ] ; then
SET="false"
COMMENT="true"
continue
fi
if [ " $SET " = " true " ] ; then
echo "$entry" >> /tmp/sxp-parsed2.$SESSION_ID.tmp
fi
done < /tmp/sxp-parsed1.$SESSION_ID.tmp
touch /tmp/sxp-parsed2.$SESSION_ID.tmp 2>/dev/null
mv /tmp/sxp-parsed2.$SESSION_ID.tmp /tmp/sxp-parsed1.$SESSION_ID.tmp
while (true) ; do
if [ " $1 " = " / " ] ; then
break
fi
if [ $n -gt $tags ] ; then
break
fi
#SET="true"
SET="false"
COMPARE="true"
MAINTAGFULL="`echo "$FULLPATH" | awk -F/ '{print $'"$n"'}'`"
MAINTAG="`echo "$MAINTAGFULL" | awk -F: '{print $1}'`"
while read entry ; do
if [ " $MAINTAG " = " * " ] ; then
mv /tmp/sxp-parsed1.$SESSION_ID.tmp /tmp/sxp-parsed2.$SESSION_ID.tmp
break
fi
TAG="`echo "$entry" | awk '{print $1}'`"
if [ " $TAG " = " $MAINTAG " ] && [ " $COMPARE " = " true " ] ; then
tags2="`echo "$MAINTAGFULL" | awk -F: '{print NF}'`"
i=1
atr_count=0
#LINE=`echo $entry | sed 's/\"//g'`
LINE=`echo $entry | tr -d "\""`
while [ $i -le $tags2 ] ; do
if [ $tags2 -eq 1 ] ; then
atr_count=$tags2
break
fi
ATTRIBUTE="`echo "$MAINTAGFULL" | awk -F: '{print $'"$i"'}'`"
if [ " `echo "$LINE" | grep -w "$ATTRIBUTE"` " != " " ] ; then
atr_count=`expr $atr_count + 1`
fi
i=`expr $i + 1`
done
if [ $atr_count -eq $tags2 ] ; then
SET="true"
COMPARE="true"
else
SET="false"
COMPARE="false"
fi
fi
if [ " $TAG " = " /$MAINTAG " ] ; then
SET="false"
COMPARE="true"
fi
if [ " $SET " = " true " ] ; then
echo "$entry" >> /tmp/sxp-parsed2.$SESSION_ID.tmp
fi
done < /tmp/sxp-parsed1.$SESSION_ID.tmp
touch /tmp/sxp-parsed2.$SESSION_ID.tmp 2>/dev/null
mv /tmp/sxp-parsed2.$SESSION_ID.tmp /tmp/sxp-parsed1.$SESSION_ID.tmp 2>/dev/null
n=`expr $n + 1`
done
mv /tmp/sxp-parsed1.$SESSION_ID.tmp /tmp/sxp-parsed2.$SESSION_ID.tmp
n=1
while read entry ; do
TAG="`echo "$entry" | awk '{print $1}'`"
if [ " $1 " = " / " ] ; then
LASTTAG="$TAG"
fi
if [ " $TAG " = " $LASTTAG " ] ; then
CLEANUPATTRIBUTES=""
for ATTRIBUTE in `echo $entry` ; do
#clear vars
CLEANUPATTRIBUTE="`echo $ATTRIBUTE | awk -F= '{print $1}'`=\"\""
CLEANUPATTRIBUTES="$CLEANUPATTRIBUTES$CLEANUPATTRIBUTE;"
eval "$CLEANUPATTRIBUTE" 2>/dev/null
eval "$ATTRIBUTE" 2>/dev/null
done
i=`expr $n + 1`
BUFFER="$LASTTAG=\"`awk '{if (NR=='$i') print $0}' /tmp/sxp-parsed2.$SESSION_ID.tmp 2>/dev/null`\""
eval "$BUFFER" 2>/dev/null
#execute defined method
"$2" #2>/dev/null
BUFFER="$LASTTAG=\"\""
eval "$BUFFER" 2>/dev/null
eval "$CLEANUPATTRIBUTES" 2>/dev/null
fi
n=`expr $n + 1`
done < /tmp/sxp-parsed2.$SESSION_ID.tmp
rm -f /tmp/sxp-parsed2.$SESSION_ID.tmp 2>/dev/null
}

tr0nix
17.10.2003, 12:29
Ich mag XML absolut nicht.. am schoenste waere es, wenn es keine Parameter sondern nur "Unique"-Eintraege geben wuerde. Dann koenntest du das ganze schoen in einem mehrdimensionalen Array abbilden :/

meez
17.10.2003, 13:16
Nein, da die Bourne Shell keine Arrays unterstützt (Nur die ksh)....

tr0nix
17.10.2003, 21:26
Also die bash (jaja ich weiss, bourne again.. aber die ist unter Linux ja Standard) unterstuetzt Arrays ab Version 2. Scriptest du etwa noch mit sh?

rup
18.10.2003, 12:10
Ich hab gerade folgende kleine Bash Funktion in meine .bashrc geschrieben.
durch den Befehl fdiskl bekomme ich von nun an alle Festplatten Partitionen aufgelistet.
Auf manchen Systemen macht ein "fdisk -l" ohne Device Angabe das gleiche, bei mir leider nicht.




function fdiskl(){
echo
echo -ne "\033[1;37m********************************************* ***********************\033[0m"
for i in `ls /dev/hd? /dev/sd?`
do
echo -ne "\r\033[1;37m******************* \033[1;33m$i \033[0m"
fdisk -l $i
echo -ne "\r\033[1;37m********************************************* ***********************\033[0m"
done
echo
}

Steve
18.10.2003, 13:06
hey,

kann man das nicht in einem eigenen Forum machen? Dann kann man da auch andere Sprachen einbeziehen, nicht nur Shell ??

Steve

rup
18.10.2003, 18:06
Das ist doch das Forum fuer Shell Skripte.

meez
20.10.2003, 10:09
Also die bash (jaja ich weiss, bourne again.. aber die ist unter Linux ja Standard) unterstuetzt Arrays ab Version 2. Scriptest du etwa noch mit sh?

Ja, da ich nicht mit Linux, sondern mit Solaris arbeite. Die Scripts müssen auch auf S7 laufen...(Und dort gibts keine bash)....
Aus diesem Grund, werden auch Rechenoperationen im Script mit "expr" berechnet, und nicht mit "Pseudo"-Integer Variablen, was einiges angenehmer wäre.

tr0nix
20.10.2003, 11:09
Ja, da ich nicht mit Linux, sondern mit Solaris arbeite. Die Scripts müssen auch auf S7 laufen...(Und dort gibts keine bash)....
Aus diesem Grund, werden auch Rechenoperationen im Script mit "expr" berechnet, und nicht mit "Pseudo"-Integer Variablen, was einiges angenehmer wäre.
Willkommen im Club. "Muss" im Geschaeft auch mit Solaris arbeiten. Fuer Sol7 gibts schon Bash, einfach nicht in der default Installation (www.sunfreeware.com).

Naja, sh unter Linux:
fortess:/vservers/pizzaman/home/shares/Bilder# ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Jun 1 21:59 /bin/sh -> bash

Wenigstens bei mir so (Debbie). Allerdings ist die ja kompatibel gegen unten.

Koenntest natuerlich auch ksh nehmen.. Systemspezifische Scripts funzen meist eh nur auf Solaris (als Linux -> Sol "Umsteiger" war das ps -ef statt ps ax muehsam zum angewoehnen ;)).
Sun sollte mal die Systemtools GNU-konform machen..

meez
21.10.2003, 13:08
Koenntest natuerlich auch ksh nehmen.. Systemspezifische Scripts funzen meist eh nur auf Solaris (als Linux -> Sol "Umsteiger" war das ps -ef statt ps ax muehsam zum angewoehnen ;)).


Solaris ist halt Unix und niht Linux...

DaMutz
11.06.2004, 18:44
Dieser Thread ist vielleicht ein bisschen veraltet, aber beim Wiki ist es jetzt bereit für die Codeschnipsel oder die Routinen, trägt eure Scripts nur ein:
http://wiki.unixboard.de/index.php/Codeschnipsel

trägt die Scripts mit dem folgendem Code ein, zwischen die <pre> so dass es einheitlich bleibt. Die Benennung ist sprache_# einfach durchnummerieren oder halt eine andere verlinkung, falls jemand eine bessere idee hat.


{| cellspacing="10px"
| rowspan="3" style="border: 1px solid #6688AA; background-color:#efefef; padding:0.5em;"|
<pre>

</pre>
|}