Ausgabe ls Befehl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

OK, werde ich mal so ändern, aber auch wenn ich os nehme, wie komme ich an die einzelnen zeilen dran?
BlackJack

@pole23: Welche Zeilen? Es war hier nicht `os.popen()` gemeint sondern die Funktion die Dir die Namen in einem Verzeichnis liefert.
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

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.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

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
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

sollte für file

Code: Alles auswählen

os.path.isfile,
sein
pole23
User
Beiträge: 17
Registriert: Sonntag 18. Juli 2010, 12:06

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?
BlackJack

@pole23: Statt `os.system()` besser das `subprocess`-Modul ohne unnötige Shell verwenden.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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 ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten