Seite 1 von 1

Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 15:42
von pole23
Hallo Zusammen,

ich bin gerade dabei, mit ein Backupscript zu Bauen. Jetzt möchte ich jedes Verzeichnis unterhalb von /var/www/clients ein eigenes tar File erzeugen. Da ich keine Lust hatte, jedes Verzeichnis manuell einzutragen, habe ich mir folgendes überlegt. Es muss doch möglich sein, sich mit dem ls Befehl die Ordner anzeigen zu lassen und dann für jedes Verzeichnis ein Tar File zu schreiben. Die Ausgabe geht schon, aber wie kann dann sagen, das er mir die Ausgabe Zeilenweise auslesen soll?
Folgenden Befehl benutze ich für die Ausgabe:

Code: Alles auswählen

output = subprocess.Popen(['ls','-l','/var/www/clients'], stdout=subprocess.PIPE)
print output.stdout.read()
Ist das bis dahin soweit korrekt?

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 15:46
von cofi
Jein, du solltest `output.communicate` nutzen. `output` ist btw ein ganz schlechter Name, weil dahinter ein Prozess steckt, keine Ausgabe.

Aber fuer deine Aufgabe solltest du dir evtl mal das `os` und das `shutil` Modul anschauen.

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 15:54
von pole23
OK, werde ich mal so ändern, aber auch wenn ich os nehme, wie komme ich an die einzelnen zeilen dran?

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:00
von BlackJack
@pole23: Welche Zeilen? Es war hier nicht `os.popen()` gemeint sondern die Funktion die Dir die Namen in einem Verzeichnis liefert.

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:06
von pole23
Mein code für die Ausgabe sieht jetzt wie folgt aus.

Code: Alles auswählen

ausgabe = subprocess.Popen(['ls','-l','/var/www/clients'], stdout=subprocess.PIPE)
print ausgabe.communicate()[0]
wie kann ich jetzt weiter vorgehen, um sagen zu können, führe jeden Ordner tar ... Ordnername.tar Pfad zu Ordner aus. Und das halt in einer Schleife. Stehe da irgendwie auf dem Schlauch.

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:07
von Rekrul
Hallo,

du musst dafür nicht den ls bemühen. Das os Modul stellt hierfür alles bereit.

Code: Alles auswählen

import os

path = '/var/www/clients'
dir_list = filter(os.path.isdir, [os.path.join(path, f) for f in os.listdir(path)]                   #Liste mit allen Verzeichnissen
file_list = filter(os.path.isdir, [os.path.join(path, f) for f in os.listdir(path)]                  #Liste mit allen Dateien

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:23
von quant
sollte für file

Code: Alles auswählen

os.path.isfile,
sein

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:37
von pole23
Hallo,

habe es jetzt grob so gelöst. Muss nur noch den Backupordner anpassen. Aber die Grundidee funktioniert.

Code: Alles auswählen

dir_list = os.listdir('/var/www/clients')
dir_list.sort()

os.chdir('/var/www/clients')

for dir in dir_list:
        target = dir + '.tar'
        tar_command = "tar -cvzf '%s' '%s'" % (target,dir)
        if os.system(tar_command) == 0:
                print 'Successful backup to', target
        else:
                print 'Backup FAILED'
kann man das so lassen? Oder gibt es Verbesserungsvorschläge?

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:48
von BlackJack
@pole23: Statt `os.system()` besser das `subprocess`-Modul ohne unnötige Shell verwenden.

Re: Ausgabe ls Befehl

Verfasst: Mittwoch 15. Dezember 2010, 16:58
von Xynon1
Zudem gibt es auch hier die Wahl das http://docs.python.org/library/tarfile.html Modul zunutzen.

Und bitte kein "os.chdir(...)" dort verwenden, oder willst du wenn du das Script von einem bestimmten Verzeichnis im Terminal ausführst, einfach woanders landen ?