Ruby für Admins (Teil 2): Dateien und Verzeichnisse
Ruby fristet als Skriptsprache für Administratoren ein Schattendasein. Allerdings zu unrecht, denn es ist einfach zu benutzen und bringt Module für jeden Einsatzzweck mit, wie unsere Reihe zeigt.
Dateien und Verzeichnisse sind das Brot und die Butter jedes Unix-Administrators. Nicht umsonst heißt es "Everything is a file". Ob es die Suche nach Dateien mit SUID-Bits ist oder das Auslesen von Prozessinformationen über das Proc-Dateisystem, immer ist es nötig, Verzeichnisse zu durchforsten, Rechte zu prüfen und Dateien zu lesen.
Mit Ruby ist das kein Problem, denn es bringt schon von Haus aus alle nötigen Funktionen dafür mit. Wer Ruby erst noch installierem muss, sollte einen Blick in den ersten Teil unserer Ruby-Reihe werfen, die die Installation der Sprache und ihrer Module unter Linux, Unix und Windows genauer erklärt.
Zunächst gibt es in der Ruby-Standardbibliothek eine ganze Reihe von Methoden der Klasse "File", die den gewohnten Unix-Kommandos beziehungsweise Systemaufrufen entsprechen. So lesen beispielsweise "atime", "ctime", "mtime" die letzte Zugriffszeit und die Zeitpunkte der letzten Änderung von Inhalt respektive Dateiattributen aus.
Wenn Sie in einem Ruby-Skript eine Datei zum Schreiben öffnen wollen, verwenden Sie dazu die Open-Methode des File-Objekts:
datei = File.new("temp.txt", "w")
datei.puts("Eine Zeile mit Inhalt")
datei.closeDas ist nicht besonders kompliziert, oder? Sie sehen hier auch, dass man die Klammern weglassen kann, wenn es eine Methode keine Parameter braucht. Wer bisher keine Erfahrung mit objektorientierten (Skript)Sprachen hat, wird sich vielleicht über die Punktnotation im Beispiel wundern. Die erste Zeile erzeugt zuerst ein Dateiobjekt. Darüber werden dann in den folgenden Zeilen dessen Methoden aufgerufen.
Um zeilenweise den Inhalt einer Textdatei zu verarbeiten gibt es wie in Perl eine Vielzahl von Möglichkeiten. Ruby-typisch ist das Iterieren mit einer Each-Methode:
datei.each_line { |zeile|
print zeile
}Wer auf diese Art alle auf der Kommandozeile einem Ruby-Skript übergebenen Dateien ("meinskript.rb Datei1.txt Datei2.txt ..") so verarbeiten will, kann auf die vordefinierte Konstante "ARGF" zurückgreifen.
ARGF.each do |zeile| puts zeile end
Weitere Methoden der File-Klasse wie ,,chown`` und ,,chmod`` regeln die Eigentümerschaft und Rechte von Dateien und Verzeichnisse. Änderungen an der Dateistruktur lassen sich über ,,copy``, ,,move``, ,,link`` und ,,symlink`` vornehmen. Bei manchen Methoden gibt es übrigens auch ein Pendant mit Fragezeichen, das die entsprechende Eigenschaft abfragt, ,,symlink?`` testet also, ob es sich beim fraglichen File um einen symbolischen Link handelt. Eine Liste der File-Funktionen findet sich in der Ruby-API-Dokumentation [1].
Ein alternatives und etwas umfassenderes Interface zum Zugriff auf Dateien und Verzeichnisse bietet die Fileutils-Sammlung [2]. Zum Beispiel enthält es Funktionen, die Verzeichnisse und Dateien rekursiv kopieren ("cp_r") oder löschen ("rm_r"):
FileUtils.rm_r site_ruby + '/mylib', :force
Auch "mkdir_p", das gleich eine ganze Verzeichnishierarchie anlegt, ist vorhanden. Es gibt sogar Funktionen, die Dateien auf ihren Inhalt hin vergleichen ("compare_file").
Infos
- [1] Ruby-API-Docs für File: [http://ruby-doc.org/core/classes/File.html]
- [2] Ruby-API-Docs für Fileutils: [http://ruby-doc.org/core/classes/FileUtils.html]


Kommentare
Kommentar hinzufügen