Einleitung
Wer Dateien kopieren oder für andere freigeben möchte, kommt oft mit den üblichen Lösungen und Standard-Kopierwerkzeugen des Betriebssystems zurecht. Aber sobald man bei teilweise kopierten Dateien den Vorgang fortsetzen oder nur bestimmte Dateien berücksichtigen möchte, wird es insbesondere unter Windows schon schwierig. Graft soll hier Abhilfe schaffen.
Noch ein Kopierwerkzeug?
Natürlich gibt es mit robocopy unter Windows und rsync und find unter Unix Systemen schon sehr ausgefeilte Werkzeuge, um das Kopieren von Dateien zu bewerkstelligen. Für rsync ist sogar eine Windows-Version verfügbar, die auch das Fortsetzen von unterbrochenen Kopiervorgängen unterstützt. Warum also graft?
Nun, zum Einen, da es als Lernprojekt dazu gedacht war, die Programmiersprache go zu erlernen. Zusätzlich bietet graft aber einige Features, die man sogar mit den gängigen Unix-Tools nur umständlich bewerkstelligen kann.
Download und Installation
Graft kann auf Github heruntergeladen werden. Um die Verwendung zu vereinfachen, sollte es in einen Pfad abgelegt werden, die über die Umgebungsvariable PATH verfügbar ist. Anschließend kann man es über die Kommandozeile aufrufen:
andreas:~ andreas$ graft
NAME:
graft - find, copy and serve files
USAGE:
graft [global options] command [command options] [arguments...]
VERSION:
0.2
COMMANDS:
find, f find files
serve, s serve files via sftp server
copy, c, cp copy files from a source to a destination
move, m, mv move files from a source to a destination
delete, d, rm delete files recursively
receive, r receive files from a graft server
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version
Auf jeder Plattform - und doch etwas unterschiedlich
Graft ist in go geschrieben und funktioniert auf Windows, Linux und MacOS. Leider ist die Bedienung unter Windows etwas unterschiedlich, denn auf "Nicht-Windows-Systemen" müssen einfache Hochkommata (') zur Angabe von Parametern verwendet werden, unter Windows allerdings doppelte Hochkommata ("). Das liegt daran, dass Windows einfache Hochkommata nicht als Begrenzungszeichen verwenden kann.
Dazu kommt noch, dass unter Windows eigentlich Backslashes (\) als Pfadtrenner eingesetzt werden und relative Pfade mit mehr als 255 Zeichen nicht unterstützt werden. Es wurde versucht, das in graft zu berücksichtigen, so das alle Varianten korrekt funktionieren.
Beispiel - graft zur Dateisuche einsetzen:
Linux / MacOS:
graft find '/home/andreas/*.jpg'
Windows
graft find "C:\Users\andreas\*.jpg"
oder
graft find "C:/Users/andreas/*.jpg"
In allen allgemeinen folgenden Beispielen werden einfache Hochkommata (') und Slashes (/) verwendet, um nicht alles doppelt hinschreiben zu müssen.
Einfache aber sichere Freigabe und Netzwerk-Dateiübertragung
Eine große Stärke von graft ist die einfache, aber sichere Freigabe von Dateien über das Netzwerk. Möchte man beispielsweise alle Bilder in einem Verzeichnis über das Netzwerk freigeben, kann folgender Befehl verwendet werden:
graft serve '*.jpg'
Anschließend wird ein Passwort abgefragt und ein SFTP Server (Secure File Transfer Protocol) gestartet, der nur die passenden Dateien zum Download freigibt. Diese können nun entweder mit einem Programm wie FileZilla oder mit graft selbst herunter geladen werden.
Der Clou: Graft kannn auch Dateien empfangen. Dabei findet es seinen Partner-Server standardmäßig via Zeroconf selbst. Alles, was man tun muss um nun die freigegebenen Bilder herunterzuladen, ist im Zielverzeichnis auf einem anderen Computer folgenden Befehl auszuführen und das Passwort einzugeben:
graft receive
Weitere Bespiele
Um sich einen Überblick zu verschaffen, was graft noch so alles kann, sind hier ein paar Beispiele, auch für komplexere Szenarien:
# Alle jpg Bilder im aktuellen Verzeichnis finden und in eine Text-Datei exportieren
graft find '*.jpg' --export-to=all-jpg-files.txt
# Alle Dateien rekursiv von /home/andreas/quelle nach /home/andreas/ziel kopieren
graft copy '/home/andreas/quelle' '/home/andreas/ziel'
# Alle Dateien und Verzeichnisse in /tmp, die ein (2016) im Namen haben, nach /home/andreas kopieren
# Klammern müssen mit \ maskiert werden, wenn sie in der Suchmaske verwendet werden
graft copy '/tmp/*\(2016\)' '/home/andreas/2016/'
# Simulation (--dry-run)
# Alle jpeg Bilder in /tmp/ nach <dateiname>_neu.<jpeg> verschieben
# Beispiel: /tmp/DSC0008.jpeg => /tmp/DSC0008_new.jpeg
graft move '/tmp/(*).(jpeg)' '/home/johndoe/pictures/$1_new.$2' --dry-run
# Alle txt-Dateien im data-Verzeichnis auf einem SFTP Server bereitstellen
graft serve 'data/*.txt' --password=graft
# Alle Dateien von einem graft server mit der IP 192.168.0.150 abholen
graft receive --host=192.168.0.150 --password=graft
# Alle jpg Bilder im /tmp, die zwischen 3 und 5 Tage alt sind, löschen
graft delete '/tmp/*.jpg' --min-age=3d --max-age=5d
Dokumentation lesen, Fehler melden oder Verbesserungsvorschläge anbringen?
In der offiziellen Dokumentation findet man weitere Informationen zur Verwendung. Falls jemand einen Fehler findet oder Verbesserungsvorschläge hat, kann man auf github über "new issue" darüber berichten.