Hallo zusammen!
Unter anderem durch die Verwendung von fslint stellte sich mir das Problem, Listen von zu löschenden Dateien zu haben, die zu lang sind/waren, um sie von Hand zu löschen bzw. sie als Parameter an rm zu übergeben. Also musste ein Skript her. Inzwischen habe ich gleich zwei Skripts, eines wesentlich umfangreicher als das andere.
Zweitens: Python
Dieses Skript ist jünger als das erste, ich stelle es aber aufgrund des geringeren Funktionsumfanges einmal voran, da es das Ziel ohne Schnick-Schnack veranschaulicht: Es übernimmt eine beliebige (?) Anzahl an Dateien, in denen pro Zeile eine Pfadangabe steht. Zeilen, die mit einem '#' beginnen, werden ignoriert, für alle Dateien wird der Pfad ausgegeben, dann wird die Datei gelöscht.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/python import sys import os sys.argv.pop(0) for name in sys.argv: file = open(name) for line in file: #os.remove(line) if not line.isspace() : if not line[0:1] =='#' : line = line.rstrip(os.linesep) try: print(line) os.remove(line) except OSError, err: pass |
Ich beginne gerade, mich mit Python zu beschäftigen, an diesem Skript ist nur die Möglichkeit der Interpretation multipler Listen von mir. Den Rest habe ich von der Dokuwiki-Homepage geklaut. Wenn jemand das Skript erweitern möchte, um es im Funktionsumfang dem untenstehenden anzupassen oder sonst sinnvoll zu erweitern, ist er/sie/es herzlich dazu eingeladen!
Erstens: PHP
Da ich seit längerem mit PHP bastle' ist diese Version weitaus elaborierter. Sie funktioniert gut, allerdings ist die Shell nicht gerade für PHP-Skripte bekannt (daher der Beginn eines Ports zu Python). Die Funktionsweise ist gleich, hier kommen allerdings ein paar Statistiken dazu:
Nach der Abarbeitung jeder Einzel-Liste (Quelldatei) wird angezeigt, wie viele Dateien aus dieser Quelldatei letztlich gelöscht wurden, nach Durchlauf des Skripts wird die Gesamtzahl der gelöschten Dateien und deren Größe in menschenlesbaren Format ausgegeben, ebenso die Laufzeit des Skripts. Weiterhin ist es hier nicht notwendig, Kommentare extra zu markieren, da für jede Zeile getestet wird, ob sie eine Datei ist, oder nicht.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #!/bin/php <?php $time_start = microtime(); function formatBytes($bytes,$precision=2){ $units = array('B','KB','MB','GB','TB'); $bytes = max($bytes,0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow,count($units)-1); $bytes /= pow(1024,$pow); return round($bytes,$precision)." ".$units[$pow]; } print "Initializing variables...\n"; $filecounter_all = 0; $filecounter_small $filesizes = 0; array_shift($argv); print "\nLoading list of files...\n"; foreach($argv as $file){ $doubles = file("doubles.txt"); print "Starting to delete doubled files...\n"; foreach($doubles as $double){ $double = trim($double); if(is_file($double) && is_readable($double)){ if(!is_file($double)) print $double." ist kein File!\n"; if(!is_readable($double)) print $double." ist nicht lesbar!\n"; $size = filesize($double); $filesizes += $size; if(unlink($double)){ print "Successfully deleted \"".$double."\" (".formatBytes($size)." – ".$size." bytes)\n"; $filecounter_all++; $filecounter_small++; } else print "Error while trying to delete \"".$double."\"! (".formatBytes($size)." – ".$size." bytes)\n"; } } print "Finished ".$file." (".$filecounter_small." files deleted).\n"; } print "Finished. ".$filecounter_all." Files deleted (".number_format($filesizes,2,",",".")." bytes total).\n"; print "Human Readable return: ".formatBytes($filesizes)."\n"; print "Memory-Peak: ".memory_get_peak_usage()."\n"; $time_end = microtime(true); $time = $time_end - $time_start; print "Executed in ".$time." seconds.\n"; |
Besonders angenehm ist die Verwendung, wenn man es unter ~/bin ablegt…
Vielleicht findet der eine oder andere hier das Skript nützlich, möglicherweise sogar derart, dass er es verbessern möchte. Dazu sei herzlich eingeladen und im Voraus gedankt.
Viel Spaß damit/dabei!
X