Eigene Script-Kreationen

Cyber

Cyber

.:DISTORTED:.
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.
 

Anhänge

  • read_mp3.sh.txt
    5,7 KB · Aufrufe: 97
Gute Idee - Ich werd des wenn das Wiki fertig iss dann auch mal dort unterbringen ..
 
Find ich eine gute, bei mir haben sich auch ein paar Skripte angesammelt
 
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
 
@Wizard:
Kling gut, kann ich auch gebrauchen.

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

Anhänge

  • read_mp3.sh.txt
    6,1 KB · Aufrufe: 40
@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.
 
@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.
 
@ 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


Code:
$ 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
 
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.
 
Mal meine funktionen aus der ~/.bashrc zeig:

Code:
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.

Code:
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

Code:
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

Code:
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

Code:
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. :)
 
Zuletzt bearbeitet:
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:
Code:
<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

Code:
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
}
 
Zuletzt bearbeitet:
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 :/
 
Nein, da die Bourne Shell keine Arrays unterstützt (Nur die ksh)....
 
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?
 
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.

Code:
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
}
 
hey,

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

Steve
 
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.
 
meez schrieb:
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..
 
Zurück
Oben