Dateien zufällig sortieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Dateien zufällig sortieren

Beitrag von rksteve » 21.11.2003 14:56:57

In einem Verzeichnis habe ich eine grosse Anzahl von Dateien. Ich möchte mir nun ein kleines Scipt schreiben dass die Datein zufällig von 1.html bis x.html umbenennt. Mein Problem ist allerdings dass ich mir natürlich keine Datei überschreiben lassen will, auch sollten wenn möglich keine Lücken sein bei den neuen Dateinamen.
Wer kann mir da helfen?

Gruss
Steve

Benutzeravatar
npi
Beiträge: 567
Registriert: 03.08.2003 17:52:10

Beitrag von npi » 21.11.2003 15:23:57

ich weiss jetzt nicht, wie gut sich bash Skripte eignen, aber sonst nimmst du eben Perl.
Der Ablauf im groben:
1. raussuchen, wieviele Dateien sich in dem Verzeichnis befinden
2. ein entsprechend großes Array erstellen, mit den nummern von 1 bis Anzahl der Dateien
3. das array zufällig mischen
4. die Dateien der Reihe nach, mit den neuen Namen umbenennen/kopieren

ich kann dir allerdings kein fertiges Script liefern, so gut kenn ich mich mit perl und arrays/zufallszahlen nicht aus (mit pascal wär das schon besser ;-) ).

viel erfolg noch,

npi

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

Beitrag von Dookie » 21.11.2003 17:04:19

Hi steve,

hier mal ein Pythonscript für Dich:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, sys
from random import choice

if len(sys.argv) == 1:
    print "usage: %s directory [extension (html by default)" % sys.argv[0]
    sys.exit()

dirpath = sys.argv[1]
if len(sys.argv) == 3:
    extension = sys.argv[2]
else:
    extension = ".html"

entries = filter(lambda x: x.endswith(extension), os.listdir(dirpath))

n = 1
while entries:
    x = choice(entries)
    entries.remove(x)
    os.rename(os.path.join(dirpath, x), os.path.join(dirpath, "%03i.%s" % (n, extension)))
    # print os.path.join(dirpath, x), "umbenannt zu", os.path.join(dirpath, "%03i.%s" % (n, extension))
    n += 1

einfach das Script als dateimixer.py speichern und mit chmod +x dateimixer.py ausführbar machen.
Dann kannst du es mit dateimixer.py verzeichnis extension aufrufen. Du musst fürs aktuelle Verzeichnis ./ verwenden und wenn keine extension angegeben wurde, wird .html als Vorgabe benutzt.

Gruß

Dookie

Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Beitrag von rksteve » 22.11.2003 09:59:16

zuerst mal danke das du dir die Mühe gemacht hast mir dieses Programm zu machen.
Es hat nur einen grossen Nachteil, es gehen dabei einige Dateien verloren!

Gruss
Steve

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

Beitrag von Dookie » 22.11.2003 12:42:51

Hi Steve,

das passiert aber nur wenn du das Script 2mal oder öfter über das Verzeichnis laufen lässt. Oder wenn sich bereits Dateien in der form ###.html in dem Verzeichnis befinden.
Hier mal ein verbessertes Script, das die Dateien zuerst von name.extension in old_name.extension umbenennt und dann durchnummeriert.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os, sys
from random import choice

if len(sys.argv) == 1:
    print "usage: %s directory [extension (html by default)" % sys.argv[0]
    sys.exit()

dirpath = sys.argv[1]
if len(sys.argv) == 3:
    extension = sys.argv[2]
else:
    extension = ".html"

entries = filter(lambda x: x.endswith(extension), os.listdir(dirpath))

for x in entries:
    os.rename(os.path.join(dirpath, x), os.path.join(dirpath, "old_"+x))

n = 1
while entries:
    x = choice(entries)
    entries.remove(x)
    os.rename(os.path.join(dirpath, "old_"+x), os.path.join(dirpath, "%03i.%s" % (n, extension)))
    # print os.path.join(dirpath, x), "umbenannt zu", os.path.join(dirpath, "%03i.%s" % (n, extension))
    n += 1
Gruß

Dookie
Zuletzt geändert von Dookie am 22.11.2003 19:51:12, insgesamt 1-mal geändert.

Benutzeravatar
rksteve
Beiträge: 716
Registriert: 11.09.2003 12:24:53
Kontaktdaten:

Beitrag von rksteve » 22.11.2003 13:51:39

Ja, danke das hilft mir jetzt weiter.

Ein kleiner Fehler hat sich noch eingeschlichen, in Ziele 26 gehört
os.rename(os.path.join(dirpath, "old_"+x), os.path.join(dirpath, "%03i.%s" % (n

.. zumindest hat es dann geklappt.

Gruss
Steve

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

Beitrag von Dookie » 22.11.2003 21:12:10

habs auch in obigem Posting geändert, vielleicht brauchts ja nochmal wer.


Gruß

Dookie

Antworten