bash-scripting und andere abartigkeiten :)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

bash-scripting und andere abartigkeiten :)

Beitrag von skar » 02.02.2005 19:02:26

1. Ich habe ein kleines script im folgenden format:

Code: Alles auswählen

VARIABLE="variable"

for $VARIABLE in blablabla; do
blablabla
done

Wie definiere ich diese Funktion jetzt als weitere Variable?
reicht folgende Syntax:

Code: Alles auswählen

NEUEVARIABLE="for blablabla"
oder geht das auch schöner und einfacher?

2. Diesem script wird ein dateiname übergeben, und diesen Dateinamen soll es weiterverarbeiten (nach dateiendung überprüfen). Wie setze ich um, daß er diesen Dateinamen nach dateiendung überprüft und an eine bestimmte stelle im script springt, diesen Teil ausführt und den restlichen teil des scriptes ausser acht lässt?

mfg AND thx

skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 02.02.2005 19:32:44

bin mir nicht sicher die Frage auch verstanden zu haben, aber möglicherweise suchst du nach soetwas:

Code: Alles auswählen

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
um in deinen Worten zu bleiben :)

Code: Alles auswählen


extension=`echo $filename | sed -e 's/^.*\.//g'`
case "$extension" in
   .mpg)
      do blabla for mpg
   ;;
   .mp3)
      do blabla for mp3
   ;;
esac

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 02.02.2005 20:54:29

@gms da hat jemand aber gut geraten. :)

So ähnlich habe ich mir das vorgestellt, danke.

Das script soll ein verzeichniss durchsuchen, die files in diesm Verzeichniss in bestimmte Ordner verschieben.

Bisher läuft das script halt so, daß es einfach erstmal nach allen mpg dateien sucht, diese verschiebt, danach nach allen jpg dateien, etc...

Er grast die kette halt nach und nach ab.

Schöner wäre es einfach, wenn er der Endung entsprechend die Datei verschiebt.

Du hast mir schonmal sehr geholfen, danke!

skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

mastermind_the_real_one
Beiträge: 644
Registriert: 16.12.2003 15:44:51

Beitrag von mastermind_the_real_one » 02.02.2005 21:53:25

Hi skar,

da Du jetzt von Perl weg zu sein scheinst und das ganze per bash lösen möchtest, könnte Dir das ed2k_preview script helfen. Es ist nicht mehr das Original-Script, sondern ein von mir leicht abgeändertes. Für das Original-Script wirst Du Dir wohl die ed2k_gui installieren müssen oder mal dort auf der Homepage nachschauen. Ich habe (glaube ich) auch nur Extensions hinzugefügt und den mplayer-Aufruf leicht abgeändert. Zumindest funktioniert es hier einwandfrei und sollte leicht an Deine Bedürfnisse anpassbar sein.


Code: Alles auswählen

#!/bin/sh

PREVIEW_BIN=""
MP3PLAYER="mpg123 -v"
OGGPLAYER="ogg123"
VIDPLAYER="mplayer -idx -vo xv -ao oss"

echo "Prototype of ed2k_gui_preview !"
echo "Got the following parameter: $*"
echo "File extension             : $ED2K_PREVIEW_EXTENSION"
echo


case "$ED2K_PREVIEW_EXTENSION" in
mp3)
	PREVIEW_BIN="$MP3PLAYER"
	;;
ogg)
	PREVIEW_BIN="$OGGPLAYER"
	;;
avi)
	PREVIEW_BIN="$VIDPLAYER"
	;;
divx)
	PREVIEW_BIN="$VIDPLAYER"
	;;
mpg)
	PREVIEW_BIN="$VIDPLAYER"
	;;
mpeg)
	PREVIEW_BIN="$VIDPLAYER"
	;;
# .bin files are usually mpeg with some format junk.
# mplayer can play .bin files
bin)
	PREVIEW_BIN="$VIDPLAYER"
	;;
# same applies for .nrg files
nrg)
	PREVIEW_BIN="$VIDPLAYER"
	;;
# ...and for .rar files
rar)
	PREVIEW_BIN="unrar t"
	;;
# ...and for .zip files
zip)
	PREVIEW_BIN="unzip -t"
	;;
*)
	echo "Don't know which binary to use with this format."
	echo "Please configure this script (it's easy, don't worry)"
	echo
	echo "Hit <enter> to close this window."
	read
	exit 0
	;;
esac
$PREVIEW_BIN "$*"

echo "Finished. Hit <enter> to close this window"
read
greetz
mastermind

Benutzeravatar
Dookie
Beiträge: 1104
Registriert: 17.02.2002 20:38:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von Dookie » 02.02.2005 22:02:53

Hi skar,

das wär eine Anwendung für Python.

movefiles.py

Code: Alles auswählen

#!/usr/bin/env python

import sys
import os
import shutil


# Directorypaths
pictsdir = os.path.expanduser("~/Documente/Pictures")
moviedir = os.path.expanduser("~/Documente/Movies")

# Destinationdirectories for extentions
dest_dict = {"jpg" : pictsdir,
             "jpeg" : pictsdir,
             "png" : pictsdir,
             "mpeg" : moviedir,
             "mpg" : moviedir,
             "avi" : moviedir}

def usage():
    print "usage: movefiles.py sourcedir"

if len(sys.argv) != 2:
    usage()
    sys.exit()
else:
    srcdir = os.path.realpath(sys.argv[1])
    if sys.argv[1] == "-h" or not os.path.isdir(srcdir):
        usage()
        sys.exit()
    dirlist = os.listdir(srcdir)
    for entry in dirlist:
        ext = os.path.splitext(entry)[1].lower() # fileextention lowercase
        if ext in dest_dict.keys():
            src = os.path.join(srcdir, entry)
            dest = os.path.join(dest_dict[ext], entry)
            shutil.move(src, dest)
            print "'%s' -> '%s'" % (src, dest)
        else:
            print "'%s' filetype unknown, not moved!" % entry
            # or do something else with unknown filetypes
Du brauchst nur deine Zielpfade einzutragen und das Dictionary mit den Dateierweiterungen ergänzen.


Gruß

Dookie

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 02.02.2005 23:21:11

@dookie WOW! hattest du das noch irgendwie rumliegen oder eben mal schnell selbst getippt? DANKE!

@mastermind auch dir vielen vielen dank! ja, bin von perl weg, weil ich mir eigentlich dachte, das es auch auf einem minimalen server laufbar sein sollte. Also muss nicht unbedingt perl installiert sein.

@all jungs, ihr seid echt grandios! wirklich, habt mir sehr geholfen. Ich habe bald 2 wochen urlaub (der erste seid knapp 7 jahren) werde mir wohl mal ein bissel Zeit nehmen und die einzelnen Sprachen mal anlesen.

bigTHX

skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

Benutzeravatar
skar
Beiträge: 143
Registriert: 04.11.2002 01:52:56
Kontaktdaten:

Beitrag von skar » 03.02.2005 00:27:04

Also, ich habe jetzt folgendes script "erdacht, aber irgendwie verschiebt er die Dateien nicht wirklich. Es kommt allerdings auch keine Fehlermeldung, also wer weiß rat?

Code: Alles auswählen

#!/bin/bash
HASH="$1"
SIZE="$2"
FILENAME="$3"

INCOMING="/home/mldonkey/incoming"
BILDERDIR="/home/mldonkey/share/bilder"
DIRS=""
MINFREEKB=1024

export LC_ALL=C
SIZEKB=$[(SIZE+1023)/1024]
REQUIREDKB=$[SIZEKB+MINFREEKB]

# not necessary with auto_commit = true
echo -e "commit\nq"|nc localhost 4000

EXTENSION="echo $FILENAME | sed -e 's/^.*\.//g'"
case "$EXTENSION" in
.jpg)
 DIRS="$BILDERDIR"
;;
esac

for dir in $DIRS; do
  DIRFREEKB=$(df -k "$dir"|gawk 'NR > 1 { print $4 }')
  if [ $DIRFREEKB -ge $REQUIREDKB ]; then
    mv "$INCOMING/$FILENAME" "$dir" && exit
  fi
done
thx
skar
jabber: skar@jabber.org

Debian Sid (DFS + DebToo), kernel 2.6.10, Xorg 6.8.1, Gnome 2.8
Alles in puren 64Bit und super leise ;)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.02.2005 09:10:49

Code: Alles auswählen

EXTENSION=`echo $FILENAME | sed -e 's/^.*\.//g'`
case "$EXTENSION" in
jpg)
 DIRS="$BILDERDIR"
 echo jpg
 ;;
 esac
Beim Ermitteln der EXTENSION brauchst du die anderen Anführungszeichen.

[edit]
oder

Code: Alles auswählen

EXTENSION=$(echo $FILENAME | sed -e 's/^.*\.//g')
[/edit]

Die Extentsion wird ohne '.' zurückgeliefert, ich habe daher auch den Punkt von "jpg" entfernt (Dieser Fehler hat sich in meinen Pseudocode schon eingeschlichen)

Antworten