Linux - find -pipe> RAR - wo ist der Fehler im Befehl?
Moinsen,
Möchte gerne Dateien und Verzeichnisse in RAR packen. Dies soll automatisch per Cron ablaufen und dementsprechend nur Dateien älter als XY packen.
Jetzt hab ich mir das Mal zusammen gebastelt. Soweit funktioniert das auch, zumindest mit Dateien ohne Verzeichnisse getestet.
Die Sache ist die, dass der Befehl für jede Datei erneut ausgeführt wird. Jedoch wurden beim ersten Durchlauf schon alle Dateien dem Archiv hinzugefügt.
Wie bekomme ich das richtig hin.
Hier der Befehl den ich mir zusammen gebastelt habe.
find /MEIN/PFAD/XYZ/ -not -newermt '-X seconds' -exec rar a TEST.rar vta t -k -r -v5G -rr20 -rv3 -m5 -ma5 -qo+ -ow -hpPASSWORD -t -mt15 '{}' \;
Bin bei solchen Befehlen bzw. mit find und dem pipen an andere Programme leider nicht wirklich vertraut.
An sich tut es das was ich möchte zumindest mit den Dateien. Verzeichnisse müsste ich noch testen.
Nur wird der Befehl bei 5 Test Dateien 5 Mal ausgeführt.
Aber beim ersten Mal sind alle Dateien im Archiv. (Archiv wird gelockt) dementsprechend bei den weiteren Durchläufen bricht RAR ab.
Hoffe mir kann da jemand helfen, danke schon Mal im Voraus.
Mfg 😋
3 Antworten
Du leitest Ausgabe mittels redirection in eine Datei um, statt per pipe zu einem anderen Befehl. Jedenfalls im Titel deiner Frage.
Danach verwendest du -exec, und dass der folgende Befehl für jede gefundene Datei erneut ausgeführt wird, ist richtig. Das ist, wie -exec funktioniert.
Zwar könntest du die Liste der gefundenen Dateien als Argumente an rar übergeben, aber da nicht garantiert werden kann, dass diese Liste nicht zu lang ist, würde ich einen anderen Weg gehen:
rar akzeptiert den Namen einer Datei, enthaltend eine Liste von Dateinamen, wenn ein @ vor den Dateinamen gesetzt wird. Die Ausgabe von find bräuchtest du dafür lediglich in eine Datei umleiten, mittels redirection, und anschließend diese als Dateiliste für rar angeben.
Ja, möglich ist das auch - aber ob es sinnvoll ist, für jede Datei erneut das Kompressionsprogramm aufzurufen, ist damit natürlich nicht gesagt. Rar hingegen nur einmal aufzurufen, und in einem Aufwasch alle Dateien ins Archiv zu packen scheint mir eine deutlich bessere Lösung.
Das muss ich mir nochmal anschauen. Die Option in RAR hatte ich nicht gefunden.
rar <command> [‐<switch 1> ‐<switch N>] archive [files...] [@listfiles...] [path_to_extract] ...
Ich verstehe nicht ganz dein Problem. Wenn du sagst, dass alle Dateien älter als n Sekunden gefunden werden sollen, und diese vom rar-Kommando nicht gelöscht werden, dann werden die natürlich auch beim nächsten Durchlauf wieder gefunden. Sie sind ja nur noch älter geworden. Alles funktioniert also richtig.
Du kannst dir jetzt überlegen die Dateien wegzukopieren oder den Suchradius anders einzuschränken (find hat sicherlich auch ein "jünger als").
(Nebenbei: ich staune, dass heute irgendwer noch RAR verwendet.)
Unter Windows hat rar tatsächlich noch eine gewisse Verbreitung. Verwendet hätte ich das aber nur, wenn es dafür eine gezielte Anforderung gegeben hätte. Freiwillig nicht 😊
Unter *nix sind komprimierte tarballs oder Zip Archive immer noch die am meisten verwendeten. Ich bin seit Mitte der 80er dabei, aber RAR ist mir eigentlich nie dabei unter gekommen. Und unter Windows ist 7zip eigentlich ideal, weil es die eierlegende Wollmilchsau ist.
Das stimmt. - Wieso nicht freiwillig? Wo ist denn das Problem daran?
Wieso sollte man nicht RAR verwenden?
Ist tatsächlich mein Favorit in dem Sinne, dass ich kaum sonst Archive nutze, wenn dann nur mit Windows in Kombi.
Dementsprechend halt RAR, da ZIP nicht so gut ist wie RAR. ZIP ist zwar deutlich mehr verbreitet aber das neueste RAR 5 ist glaube ich was die Qualität der Kompression usw. an geht immer noch von allen mit auf dem Ersten Platz.
Außerdem halt zusätzlich Gewohntheit. WinRAR ist eines der ersten Programme die ich auf dem PC installiere, sowie eins was an sich immer mit drauf ist und auch schon seit dem ich PCs besitze/bedienen kann xP
Auf den ersten Blick sehe ich da weder eine pipe noch eine redirection.
Die exec Option wird für jedes gefundene Objekt ausgeführt.
Lass dir doch erstmal anzeigen, was überhaupt gefunden wird. Vielleicht siehst du dann schon das Problem und die Lösung.
Achso, ja stimmt. Vorher hab ich es mit pipe versucht. Das ging irgendwie garnicht. Müsste ich nochmal schauen. Den Befehl hab ich auch noch irgendwo.
Also wenn ich den Befehl so ausführe, bekomme ich die Dateien samt Pfad aufgelistet.
Gehe jetzt aber erstmal pennen. Vielleicht hat ja morgen schon jemand ne Antwort drauf.
Ansonsten ne Nacht drüber schlafen und nochmal mit mehr Energie sich das ganze anschauen wird wahrscheinlich auch helfen.
Hab ich mir auch gedacht, das exec das bei jeder Datei tut. Trotzdem was mich dabei dann ein wenig verwirrt ist die Tatsache, dass beim ersten Durchlauf schon alle Dateien drin sind. Müssten dann nicht theoretisch bei jedem Durchlauf die einzelnen Dateien mit exec den Befehl ausführen? Und nicht quasi jedes Mal dann alle?
Tja, ich hab es mal der Einfachheit halber mit tar ausprobiert. Das funktoniert auch mit exec problemlos. Wie ein anderer User aber bereits geschrieben hat, passt sehr wahrscheinlich deine Zeitauswahl nicht, weshalb Du bei jeder Ausführung die alten Dateien immer wieder dazu erhältst. Das gleiche Problem würdest Du allerdings auch mit einer "Listenverarbeitung" haben.
Eine Pipe Version könnte so aussehen
find /usr/sbin -type f -name mk* | xargs -n 1 tar -uf test2.tar
Ich hab mich jetzt nicht mit rar auseinander gesetzt und natürlich fehlen noch deine gewünschten Zeitangaben.
Und denk dran, dass cron nicht die Userumgebung zur Verfügung hat.
Eine exec Variante sollte auch möglich sein, aber dann müsste man doch die Dateien zu einem existierenden Archiv hinzu fügen. Von daher halte ich die Listen-Eingabe für effektiver.