Seite 1 von 1

*.* etc über Programmparameter?

Verfasst: Donnerstag 24. März 2005, 20:04
von Lvis
Hallo Leute,

ich hab n kleines Script geschrieben (Linux) welches mir automatisch durch auslesen der MP3-Tags die MP3-Dateien umbenennt. Nun will ich aber nicht das Script für jedes File einzelen aufrufen, sondern Zb auch ein *.*, *.mp3 etc zulassen.

Gibts dafür eigne Möglichkeit, dass ALLE möglichkeiten, die die Bash bietet (also *.*, ?, etc) umgesetzt werden ohne dafür selber einen Parser zu schreiben?

Danke schonmal für Eure Hilfe und n frohes und ruhiges Osterfest :)

Verfasst: Donnerstag 24. März 2005, 20:10
von Leonidas
Das macht deine Shell schon von sich aus, der Spaß heist ja nicht umsonst Shell Expansion. Also mal zwei Zeilen Code:

Code: Alles auswählen

import sys
print sys.argv

Code: Alles auswählen

$ python shellargs.py *.pyc
['shellargs.py', 'entropy.pyc', 'iopsqrt.pyc', 'mathfun.pyc', 'matrix.pyc', 'ocnprimes.pyc', 'primebench.pyc', 'tkturtle.pyc']
War zwar keine Bash, sondern eine ZSH, aber das Konzept ist das gleiche. Einfach aber praktisch.

Ich wünsch dir auch schöne Ostern.

Verfasst: Donnerstag 24. März 2005, 20:33
von Gast
Dh heisst wenn ich zB "mp3tag.py *.mp3" aufrufe bedeutet das, dass er das Script xx-mal aufruft, oder wie soll ich das verstehen?
Sorry wenn ich bisschen dumm frage, aber ich habe noch nicht viel in Python gemacht, und da bin ich schonb froh das das kleine Projekt jetzt soweit klappt wie ich mir es vorstelle :)

Weil moemntan nehme ich ja sys.argv[1] oder wars 0? Und dann mache ich n Open-Befehl auf den Variableninhalt!

Verfasst: Donnerstag 24. März 2005, 20:41
von mawe
Hi!

In sys.argv stehen die Argumente, die Du deinem Script übergibst, wobei sys.argv[0] der Name des Scripts selbst ist. Wenn Du das Script so startest wie Leonidas es gezeigt hat, kannst Du z.B. folgendes machen:

Code: Alles auswählen

import sys

for song in sys.argv[1:]:
    print song
Aufrufen mit

Code: Alles auswählen

python scriptname.py *.mp3
Jetzt sollten alle mp3-Files im Verzeichnis ausgegeben werden.

Gruß, mawe

Re: *.* etc über Programmparameter?

Verfasst: Donnerstag 24. März 2005, 20:49
von fs111
Lvis hat geschrieben:Hallo Leute,

ich hab n kleines Script geschrieben (Linux) welches mir automatisch durch auslesen der MP3-Tags die MP3-Dateien umbenennt. Nun will ich aber nicht das Script für jedes File einzelen aufrufen, sondern Zb auch ein *.*, *.mp3 etc zulassen.

Gibts dafür eigne Möglichkeit, dass ALLE möglichkeiten, die die Bash bietet (also *.*, ?, etc) umgesetzt werden ohne dafür selber einen Parser zu schreiben?

Danke schonmal für Eure Hilfe und n frohes und ruhiges Osterfest :)
Ich weiß nicht, ob das Plattformübergreifen funktioniert, denn die Auflösung der Name wird unter unixoiden Systemen von der Shell erledigt, d.h. die Shell wandelt das um und gibt dann die aufgelösten Namen an das eigentliche Programm weiter. Unter Win war (ist?) das anders, da muss sich jedes Programm selber darum kümmern.

fs111

Re: *.* etc über Programmparameter?

Verfasst: Donnerstag 24. März 2005, 21:29
von Leonidas
fs111 hat geschrieben:Ich weiß nicht, ob das Plattformübergreifen funktioniert, denn die Auflösung der Name wird unter unixoiden Systemen von der Shell erledigt, d.h. die Shell wandelt das um und gibt dann die aufgelösten Namen an das eigentliche Programm weiter. Unter Win war (ist?) das anders, da muss sich jedes Programm selber darum kümmern.
Naja, unter Windows ist das unter cmd.exe so, aber ich habe zsh.exe benutzt.
Okay, ich guck mal, dass ich eine Regex-Lösung für dich hinbekomme, die auch das arme cmd.exe schluckt.

Verfasst: Donnerstag 24. März 2005, 22:35
von Leonidas
Hier mal ein billiger Versuch (nicht vergessen, ich kann keine Regulären Ausdrücke, also könnten sie etwas buggy sein).

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import sys, os, re
regex = sys.argv[1]

# translate Windows "regex" to PCRE
regex = regex.replace('*.', r'.*.')
regex = regex.replace('?', r'.')

files = os.listdir(os.getcwd())
rgx = re.compile(regex, re.IGNORECASE)

def matchregex(f):
    if re.match(rgx, f):
        return True
    else: 
        return False

print filter(matchregex, files)
Ich habe es nur ein wenig getestet, so funtioniert * und ?, aber das war schon alles. Du kannst es aber problemlos erweitern, sollte ja nicht soo schwer sein, ich habs ja auch geschafft.

Verfasst: Donnerstag 24. März 2005, 23:40
von BlackJack
Meine Güte warum so umständlich... Für so etwas ist das 'glob'-Modul aus der Standardbibliothek da:

Code: Alles auswählen

In [10]: import glob

In [11]: glob.glob('*.py')
Out[11]: ['test.py', 'radioscan.py', 'BeautifulSoup.py']

Verfasst: Freitag 25. März 2005, 08:32
von Leonidas
BlackJack hat geschrieben:Meine Güte warum so umständlich...
Gute Frage, man sollte Microsoft fragen warum deren Shells so schlecht sind, das sie das nicht selbst können.

Verfasst: Samstag 26. März 2005, 00:39
von BlackJack
Oder die Anwender warum sie sich keine ordentliche Shell zulegen wie Du. :-)