Datei Manipulation: Scripting Frage

Ich habe ein Skript, das eine Verbindung zur Datenbank herstellt und alle Datensätze erhält, die die Abfrage ausgeben. Diese Aufzeichnungsergebnisse sind Dateien, die auf einem Server vorhanden sind, also jetzt habe ich eine Textdatei, die alle Dateinamen darin hat.

Ich möchte ein Skript, das wissen würde:

  1. Was ist die Größe jeder Datei in der Datei output.txt ?
  2. Was ist die Gesamtgröße aller in dieser Textdatei vorhandenen Dateien?

Update: Ich würde gerne wissen, wie kann ich meine Aufgabe mit Perl programming language , alle Eingaben würden sehr geschätzt.

Anmerkung: Ich habe keine spezifische Sprachbeschränkung, es könnte entweder Perl oder Python Skriptsprache sein, die ich von der Unix-Eingabeaufforderung ausführen kann. Zurzeit verwende ich die Bash-Shell und habe sh und py Skript. Wie kann man das machen?

Meine Skripte:

 #!/usr/bin/ksh export ORACLE_HOME=database specific details export PATH=$ORACLE_HOME/bin:path information sqlplus database server information<<EOF SET HEADING OFF SET ECHO OFF SET PAGESIZE 0 SET LINESIZE 1000 SPOOL output.txt select * from my table_name; SPOOL OFF EOF 

Ich weiß, du -h wäre der Befehl, den ich verwenden sollte, aber ich bin mir nicht sicher, wie soll mein Skript sein, ich habe etwas in Python versucht. Ich bin völlig neu in Python und es ist meine erste Zeitaufwand.

Hier ist es:

 import os folderpath='folder_path' file=open('output file which has all listing of query result','r') for line in file: filename=line.strip() filename=filename.replace(' ', '\ ') fullpath=folderpath+filename # print (fullpath) os.system('du -h '+fullpath) 

Dateinamen in der Ausgabetextdatei sind 007_009_Bond Is Here_009_Yippie.doc : 007_009_Bond Is Here_009_Yippie.doc

Jede Anleitung wäre sehr geschätzt.

Aktualisieren:

  1. Wie kann ich alle Dateien, die in der Datei output.txt , an einen anderen Ordner mit Perl ?
  2. Nach dem Schritt1, wie kann ich alle Dateien löschen, die in der Datei output.txt vorhanden sind?

Irgendwelche Vorschläge würden sehr geschätzt.

4 Solutions collect form web for “Datei Manipulation: Scripting Frage”

In Perl, der -s Filetest-Operator ist probaby, was Sie wollen.

 use strict; use warnings; use File::Copy; my $folderpath = 'the_path'; my $destination = 'path/to/destination/directory'; open my $IN, '<', 'path/to/infile'; my $total; while (<$IN>) { chomp; my $size = -s "$folderpath/$_"; print "$_ => $size\n"; $total += $size; move("$folderpath/$_", "$destination/$_") or die "Error when moving: $!"; } print "Total => $total\n"; 

Beachten Sie, dass -s gibt Größe in Bytes nicht Blöcke wie du .

Bei weiteren Untersuchungen ist perl's -s äquivalent zu du -b . Sie sollten wahrscheinlich die Mann-Seiten auf Ihrem spezifischen du lesen, um sicherzustellen, dass Sie tatsächlich messen, was Sie beabsichtigen zu messen.

Wenn du wirklich die du Werte wünschst, ändere die Zuordnung zu $size oben zu:

 my ($size) = split(' ', `du "$folderpath/$_"`); 

Eyeballing, können Sie IHRE Skript Arbeit auf diese Weise machen:

1) Löschen Sie die Zeile filename=filename.replace(' ', '\ ') Escaping ist komplizierter als das, und Sie sollten nur den vollständigen Pfad angeben oder eine Python-Bibliothek verwenden, um es auf der Grundlage des spezifischen Betriebssystems zu entkommen;

2) Du vermisst vermutlich ein Trennzeichen zwischen dem Pfad und dem Dateinamen;

3) Du brauchst einfache Anführungszeichen um den vollständigen Pfad im Aufruf von os.system.

Das funktioniert für mich:

 #!/usr/bin/python import os folderpath='/Users/andrew/bin' file=open('ft.txt','r') for line in file: filename=line.strip() fullpath=folderpath+"/"+filename os.system('du -h '+"'"+fullpath+"'") 

Die Datei "ft.txt" hat Dateinamen ohne Pfad und der '/Users/andrew/bin' ist '/Users/andrew/bin' . Einige der Dateien haben Namen, die entkommen müssen, aber das wird mit den einzelnen Zitaten um den Dateinamen gesorgt.

Das wird du -h auf jeder Datei in der .txt-Datei laufen lassen, aber gibt dir nicht die Summe. Das ist ziemlich einfach in Perl oder Python.

Hier ist ein Python-Skript (basierend auf dir), um das zu tun:

 #!/usr/bin/python import os folderpath='/Users/andrew/bin/testdir' file=open('/Users/andrew/bin/testdir/ft.txt','r') blocks=0 i=0 template='%d total files in %d blocks using %d KB\n' for line in file: i+=1 filename=line.strip() fullpath=folderpath+"/"+filename if(os.path.exists(fullpath)): info=os.stat(fullpath) blocks+=info.st_blocks print `info.st_blocks`+"\t"+fullpath else: print '"'+fullpath+"'"+" not found" print `blocks`+"\tTotal" print " "+template % (i,blocks,blocks*512/1024) 

Beachten Sie, dass Sie diesmal nicht den Dateinamen angeben oder entgehen müssen. Python macht es für dich. Dies berechnet Dateigrößen mit Zuweisungsblöcken. Genauso wie du es tut. Wenn ich du -ahc gegen die gleichen Dateien ft.txt ich in ft.txt aufgeführt habe, ft.txt ich die gleiche Nummer (gut ja, du 24324 KB es als 25M und ich bekomme den Report als 24324 KB ), aber es berichtet die gleiche Anzahl von Blöcken. (Seitliche Anmerkung: "Blöcke" werden immer als 512 Bytes unter Unix angenommen, obwohl die tatsächliche Blockgröße auf größerer Scheibe immer größer ist.)

Schließlich können Sie erwägen, Ihr Skript so zu machen, dass es eine Befehlszeilengruppe von Dateien lesen kann, anstatt harte Codierung der Datei und den Pfad im Skript. Erwägen:

 #!/usr/bin/python import os, sys total_blocks=0 total_files=0 template='%d total files in %d blocks using %d KB\n' print for arg in sys.argv[1:]: print "processing: "+arg blocks=0 i=0 file=open(arg,'r') for line in file: abspath=os.path.abspath(arg) folderpath=os.path.dirname(abspath) i+=1 filename=line.strip() fullpath=folderpath+"/"+filename if(os.path.exists(fullpath)): info=os.stat(fullpath) blocks+=info.st_blocks print `info.st_blocks`+"\t"+fullpath else: print '"'+fullpath+"'"+" not found" print "\t"+template % (i,blocks,blocks*512/1024) total_blocks+=blocks total_files+=i print template % (total_files,total_blocks,total_blocks*512/1024) 

Sie können dann das Skript (nach chmod +x [script_name].py ) von ./script.py ft.txt und es wird dann den Pfad zur Kommandozeilen-Datei als den angenommenen Pfad zu den Dateien "ft.txt" . Sie können auch mehrere Dateien verarbeiten.

Sie können es in Ihrem Shell-Skript selbst tun.

Sie haben alle Dateinamen in Ihrer output.txt Datei output.txt , alles, was Sie am Ende des vorhandenen Skripts hinzufügen müssen:

 < output.txt du -h 

Es wird die Größe jeder Datei und auch eine Summe am Ende geben.

Sie können das Python-Skelett verwenden, das Sie skizziert haben und fügen Sie os.path.getsize(fullpath) , um die Größe der einzelnen Datei zu erhalten.

Zum Beispiel, wenn du ein Wörterbuch mit dem Dateinamen und der Größe wolltest, kannst du:

 dict((f, os.path.getsize(f)) for f in file) 

Denken Sie daran, dass das Ergebnis von os.path.getsize(...) in Bytes ist, also musst du es umwandeln, um andere Einheiten zu bekommen, wenn du willst.

Im Allgemeinen ist os.path ein Schlüsselmodul zum Manipulieren von Dateien und Pfaden.

  • Finden Sie die aktuellste Datei in einem Verzeichnis, ohne den Inhalt zu lesen
  • Pipe Ausgabe von Shell-Befehl zu einem Python-Skript
  • OSError - Errno 13 Berechtigung verweigert
  • Entfernen Sie alle Zeilen mit dem Wort NOT im Wörterbuch
  • Wo finde ich das xml.dom python paket für den python-2.6.0-8.9.28 und ich habe eine suse / x86_64 version von Linux version
  • Verwenden von absoluten Unix-Pfaden in Fenstern mit Python
  • Wie man Windows-Datei in der linux-Umgebung liest
  • Entfernen Sie alle Dateien in einem Verzeichnis
  • Warum wählt select.select () Arbeit mit Datenträgerdateien aber nicht epoll ()?
  • Gleichbedeutend mit dem find coreutil-Befehl in python 3 für die rekursive Rückgabe aller Dateien und Ordner in einer Verzeichnisstruktur?
  • Machen Sie alle neuen Verzeichnisse haben 777 Berechtigungen
  • Python ist die beste Programmiersprache der Welt.