ubuntuusers.de

Rar packen Script

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

repexx

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Moin,

ich hoffe hier kann mir jemand weiterhelfen bei meinem Problem. Ich muss hier recht häufig Dateien per rar packen. Bisher hab ich das per Shell gemacht. Aber Das Ganze kann man ja auch alles automatisieren lassen und ich hoffe hierbei kann mir jemand helfen.

Undzwar soll folgendes passieren.

rar a -m0 -v262144000b dido Das ist der Ordnername

Das soll mit etwa 30 Ordnern passieren. Alles sehr viel arbeit, wenn man dieses per shell macht.

Der rar Name, bzw des Splittfiles soll sich aus dem Ordnernamen zusammensetzen, heißt der Ordner "Das ist der Ordnername" dann soll das Archiv eben den namen dido haben. Also immer den Anfangsbuchstaben des anfangenden Wortes.

Was noch ganz cool wäre, wenn sich das irgendwie einbauen lässt. Das nachdem das rar Spittarchiv erstellt wurde, dass direkt auch der Ordner wieder gelöscht wird.

Kann mir hierzu jemand helfen? Besten Dank, wenn sich jemand damit auskennen sollte.

mfg

Moderiert von prometheus0815:

Ins richtige Forum verschoben. Bitte beachte beim Erstellen neuer Themen die als wichtig markierten Sticky-Threads "Welche Themen gehören hier her und welche nicht?" in jedem Unterforum.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

repexx schrieb:

rar a -m0 -v262144000b dido Das ist der Ordnername

Wenn Du den nicht-rar-Experten noch verrietest, was das macht (a, -m0, -vXY), wo die Ordner sind und wieweit das bereits automatisiert ist.

echo "Das ist der Ordnername" | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g'

... des Splittfiles

... dass direkt auch der Ordner wieder gelöscht wird.

rm "Das ist der Ordnername"
# oder 
rm Das\ ist\ der\ Ordnername

oder eine kranke Kombination der beiden:

rm Das\ "ist der"\ Ordnername

Ah - das heißt 2.6MB?

verz="Das ist der Ordnername"
rarname=$(echo $verz | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g')
rar a -m0 -v262144000b $rarname "$verz" && rm -rf "$verz" 

Vorsicht vor rm -rf ! Erst in einer sicheren Umgebung testen, wo nix kaputtgehen kann (Live-CD, Virtuelle Maschine).

repexx

(Themenstarter)

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Also im Grunde ist das nur ein Befehl, den ich über das Wiki hier zusammengeschustert habe.

-m0 heißt, dass er es nur speichern soll. und nicht kompremieren soll.

-v gibt an die größe des spittarchives. also es sollen 250 mb immer werden.

Das verzeichnis ist einfach eins im root verzeichnis selber. /root/files/

Ich möchte jetzt gerne, dass er automatisch alles abarbeitet. Und jeden order mit rar packt.

verz="Das ist der Ordnername"
rarname=$(echo $verz | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g')
rar a -m0 -v262144000b $rarname "$verz" && rm -rf "$verz" 

Ich glaub mit dem befehl, würde er nur ein ordner packen oder? Ich habs jetzt nicht ausprobiert, sieht mir aber danach aus. Ich wollte den kompletten vorgang ja eben automatisieren.

Was ich derzeit mache ist. Ein ordner packen. Warten bis es fertig ist. Und dann den nächsten. Alles manuell eben. Das Ganze ist eben mit viel arbeit verbunden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

repexx schrieb:

Also im Grunde ist das nur ein Befehl, den ich über das Wiki hier zusammengeschustert habe.

-m0 heißt, dass er es nur speichern soll. und nicht kompremieren soll.

Aha - sowas wie tar.

-v gibt an die größe des spittarchives. also es sollen 250 mb immer werden.

Ja. Wieso kam ich auf 2.6MB? Keine Ahnung.

Das verzeichnis ist einfach eins im root verzeichnis selber. /root/files/

Verwirr uns nicht! Das root-Verzeichnis, ala Wurzelverzeichnis, ist / ohne alles. Es gibt auch ein Verzeichnis namens root, welches das home-Verzeichnis von root ist. /root/files/ wäre aber immer noch nur ein Verzeichnis. Geht es also um /root/a, /root/b, /root/c usw, oder um /root/files/a, /root/files/b oder um /a /b /c?

Ich möchte jetzt gerne, dass er automatisch alles abarbeitet. Und jeden order mit rar packt.

Aber für einen Ordner o soll er alle Unterordner u mit einpacken, und diese nicht nochmal separat packen, oder?

find /root -maxdepth 1 -type d 

iteriert über alle Ordner unterhalb von /root

verz="$1"
rarname=$(echo $verz | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g')
rar a -m0 -v262144000b $rarname "$verz" && rm -rf "$verz" 

Ich glaub mit dem befehl, würde er nur ein ordner packen oder? Ich habs jetzt nicht ausprobiert, sieht mir aber danach aus. Ich wollte den kompletten vorgang ja eben automatisieren.

Also das Skript dort nennst Du rar250.sh, z.B., und machst aus "Das ist der Ordnername" einen Parameter, $1, u.d. script machst Du ausführbar und legst es nach ~/bin welches Du evtl. anlegen, und dann in Deinen Pfad aufnehmen mußt.

Mit

find /root -maxdepth 1 -type d -exec rar250.sh "{}" \; 

sollte es möglich sein alle Unterverzeichnisse unter /root/ separat zu rar-en. Das Archiv wird dann da abgelegt, von wo Du find aufrufst.

Das find-Kommando kann natürlich auch in ein script gespeichert werden.

Was ich derzeit mache ist. Ein ordner packen. Warten bis es fertig ist. Und dann den nächsten. Alles manuell eben. Das Ganze ist eben mit viel arbeit verbunden.

Ungetestet - das rm -rf sollte vorher überprüft werden, insbes. mit Ordnern die Blanks enthalten.

Wenn der Ordner wirklich /root/files heißt, dann:

find /root/files -maxdepth 1 -type d -exec rar250.sh "{}" \; 

Geht es ums Wurzelverzeichnis, dann:

find / -maxdepth 1 -type d -exec rar250.sh "{}" \; 

Allerdings besteht dann die große Gefahr, daß das Skript die im Entstehen befindlichen Archive wiederum in Archive packt - das wird krachen. Und wenn Du keine Leseberechtigung hast für /root/files ...

repexx

(Themenstarter)

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Hm, ich versteh gerade leider nur Bahnhof.

Also bei mir ist das folgendermaßen aufgebaut, ich bin als root angemeldet. Und bin im Verzeichnis:

/root/files/

in dem verzeichnis files sind um die 30-40 ordner.

Das ganze was jetzt dabei passieren soll. Da ist zb ein Ordner unter files der heißt Dies ist ein schöner Ordner.

Dann soll er diesen Ordner packen mit den Files die dort drin sind. Zu dieso.part1.rar etc.

Dies soll ebenso passieren mit allen anderen Ordern. Was irgenwie auch noch gut wäre, wenn er die files die per rar erstellt wurden, genau in den ordner packt der gepackt wurde. Und nur die files gelöscht werden die zuvor in dem ordner sind.

Ich hab das ganze leider nicht so verstanden, wie ich mit dem Script vorgehen soll. Also ich erstell eine .sh Datei und was soll ich da jetzt genau reinschreiben? Diese soll ich dann in /usr/bin denke ich mal packen und diese ausfürhbar machen. So das man diese dann über shell mit dem befehl, so wie die Datei heißt ausführen kann? Hab ich das so richtig verstanden. Ich kenn mich damit wie man schon sieht leider nicht so wirklich aus :7

Wäre um hilfe dankbar.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

repexx schrieb:

/root/files/

in dem verzeichnis files sind um die 30-40 ordner.

30-40 Ordner im root-Home erscheint mir ziemlich viel, aber gut - was geht es mich an.

Das ganze was jetzt dabei passieren soll. Da ist zb ein Ordner unter files der heißt Dies ist ein schöner Ordner.

Nicht nur Blanks, auch Umlaute im Ordnernamen? Na, hoffen wir mal, daß das gut geht, und die Ordner nie auf andere Systeme kopiert werden müssen. ☺ Aber keine Bange, ...

Dann soll er diesen Ordner packen mit den Files die dort drin sind. Zu dieso.part1.rar etc.

Dies soll ebenso passieren mit allen anderen Ordern.

Das habe ich so auch verstanden.

Was irgenwie auch noch gut wäre, wenn er die files die per rar erstellt wurden, genau in den ordner packt der gepackt wurde. Und nur die files gelöscht werden die zuvor in dem ordner sind.

Dann hast Du anschließend 40 Ordner mit je einer Datei im Ordner. Eigentlich nicht passend zum Grund, wieso man Ordner hat.

Insbesondere geht das nur mit Verschiebebahnhof - das Archiv darf sich ja nicht selbst enthalten. Wenn Du den Ordner /root/files/zyxel packst, der zu /root/files/z.rar wird, und in zyxel ist eine Datei a, dann wird die ja angefaßt und nach z.rar gepackt bevor z.rar angefaßt wird, und später wird versucht z.rar in sich selbst zu packen. Das mußt Du rar also entweder sagen, daß er das nicht tun soll, oder das Archiv nach /tmp packen z.B., den Verzeichnisinhalt löschen, und dann das Archiv hineinschieben. Gut - das wäre auch wichtig, um die Ordner

  • Das ist ein schöner Ordner

  • Das ist ein scheußlicher Ordner

nicht beide nach dieso.rar zu packen.

Ich hab das ganze leider nicht so verstanden, wie ich mit dem Script vorgehen soll. Also ich erstell eine .sh Datei und was soll ich da jetzt genau reinschreiben?

#!/bin/bash
#
# 
#
verz="$1"
rarname=$(echo $verz | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g')
rar a -m0 -v262144000b .root.tmp.rar "$verz" && find "$verz" -mindepth 1 -delete 
mv .root.tmp.rar "$verz"/$rarname.rar 

Diese soll ich dann in /usr/bin denke ich mal packen

Verschieben, nicht packen. Und nein - nach /root/bin, wenn es root ausführen soll. Dazu /root/bin anlegen, wenn es noch nicht existiert, und in den Pfad aufnehmen.

und diese ausfürhbar machen. So das man diese dann über shell mit dem befehl, so wie die Datei heißt ausführen kann?

Nein, mittels find für jedes Verzeichnis ausführen. Aber abweichend von oben muß man auch mindepth verwenden:

find ./ -mindepth 1 -maxdepth 1 -type d -exec rar250.sh "{}" \; 

Du kannst auch rar250.sh irgendwo speichern, und mit absolutem Pfad aufrufen, z.B.:

find ./ -mindepth 1 -maxdepth 1 -type d -exec /home/repexx/bin/rar250.sh "{}" \; 

oder an Ort und Stelle speichern, und so aufrufen:

find ./ -mindepth 1 -maxdepth 1 -type d -exec ./rar250.sh "{}" \; 

Vorsicht! Der delete-Befehl ist nicht umkehrbar!

repexx

(Themenstarter)

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Ok, ich habs gerade mal so getestet. Leider tut es noch nicht so ganz. Also er erstellt das erste Archiv. Und dann beim 2 ordner, wenn er diesen packen, will gibts ein problem. Er will den gleichen archivnamen wieder benutzen. Der ist aber eben schon irgendwo abgelegt. Und von da gehts eben nicht wirklich weiter... Das ergebis sah jetzt so aus. Also die beiden ordner die ich zum testen genommen habe sind noch dort, aber eben die rar archive fehlen.

Creating archive .root.tmp.rar

Adding    ./Test Archiv 1/1.avi           
Calculating the control sum     

.root.tmp.part1.rar already exists. Overwrite it ?
[Y]es, [N]o, [A]ll, n[E]ver, [R]ename, [Q]uit n

Cannot rename .root.tmp.rar to .root.tmp.part1.rarmv: cannot stat `.root.tmp.rar': No such file or directory

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Hm. Das dürfte ein Problem damit sein, daß er bei mir nur kl. Verzeichnisse, die immer in ein Rar-Volume gepaßt haben, verarbeitet hat.

Wenn ich sage, er soll Archive des Namens .root.tmp.rar erzeugen, dann erzeugt er, wenn es nicht in eins paßt,

  • .root.tmp.rar

  • .root.tmp.part1.rar

  • .root.tmp.part2.rar

oder

  • gleich 1, 2,

  • oder 0, 1, 2,

  • oder nix, 0, 1, 2

Die müssen bei mv dann ja alle verschoben werden. Wenn man sie dann auch noch umbenennt wird es unübersichtlich.

Also wohl besser so:

rar a -m0 -v262144000b $rarname.rar "$verz" && find "$verz" -mindepth 1 -delete 
mv $rarname.*rar "$verz"/ 

die zwei Scriptzeilen. Auch ohne Gewähr.

repexx

(Themenstarter)

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Hey super!! ☺ Das klappt wirklich gut. Vielen dank schon mal.

Ich hab allerdings noch ein kleines Problem damit. Und zwar sind das die Sonderzeichen. Ich hab gerade mal hier auf meinem Notbook das Ganze ausprobiert.

In den Dateiordnern selber kommen leider auch öffters Sonderzeichen vor.

Ich habe mal zum testen den Ordner [Na]menloser Ordner # (2100) genannt.

Creating archive ./[n]mo#(2100).rar

Adding    ./[Na]menloser Ordner # (2100)/wlan.txt                     OK 
Adding    ./[Na]menloser Ordner # (2100)                              OK 
Done
mv: Aufruf von stat für „./[n]mo#(2100).*rar“ nicht möglich: No such file or directory

Ist dann hierbei das Ergebnis.

Er legt dann das Archiv als [n]mo#(2100).rar jedoch nicht in den Ordner. Wenn es sich noch vermeiden ließe, dass das rar Archiv selber keine Sonderzeichen hat und, es dann auch in den Ordner verschoben wird, wäre es perfekt.

Danke dir auf jedenfall schon mal für die Hilfe, dass Ganze erspart mir wirklich sehr viel Arbeit in Zukunft.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Ja, es gibt Generatoren, die nehmen irgendwo einen Text her, und wandeln es stur in einen Ordnernamen um. Woher dieses Juwel der Ordnernamen stammt:

./[Na]menloser Ordner # (2100)

wüßte ich ja dann doch gerne. Die eckigen Klammern werden gerne in regulären Ausdrücken verwendet, um Gruppen zu definieren, das wäre hier Nmenloser und amenloser, und das singuläre [ ist außerdem ein Programm, allerdings weder [N, noch ./[ sondern wirklich nur [ oder /usr/bin/[, aber der Hash # ist ja mit Blank abgesetzt, und sagt normalerweie: ab hier bis Zeilenende ist Kommentar.

Inhaltlich ist das natürlich erst recht Schwachsinn - ein Order, der den Namen "Namenloser Ordner #4 hat ist nicht namenlos, sondern verlogen; er hat ja einen Namen. Ich würde den stracks umbenennen in 'lügenhafter-Ordner-Nummer-2100'. ☺

Das sed-Kommando könnte ein Ansatzpunkt sein, um häßliche Mißgeburten auszusondern.

rarname=$(echo $verz | tr '[A-Z]' '[a-z]' | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g;s/[#()]//g;s/\[//g;s/\]//g')

Das sieht dann so aus:

echo " ./[Na]menloser Ordner # (2100)/wlan.txt    " | sed 's/\([a-z]\)[a-z]*/\1 /g;s/ //g;s/[#()]//g;s/\[//g;s/\]//g'
./NamOr2100/w.t

repexx

(Themenstarter)

Anmeldungsdatum:
17. Januar 2009

Beiträge: 159

Wow vielen Dank. Läuft 1a ☺ So macht das packen in Zukunft wirklich Spass, wenn alles von alleine abläuft ☺

Antworten |