Hallo, ich habe ein Problem mit ein paar Zeilen in einem backup script.. Wenn die Datei in $1 existiert und älter als 7 Tage ist dann soll diese nach TMPDIR verschoben und der (backup)level auf null gesetzt werde. Ansonsten soll der Wochentag den level angeben. Hier mein Versuch der nicht tut, kann mir jemand helfen? Leider bin ich mit man bash, man date, man ... nicht so ganz zum Ziel gekommen. if [ -r $1] && [find $1 -mtime +7 \; ]; then mv $1 TMPDIR level=0 else level= date +%w fi Ich hoffe ich war nicht zu diletantisch der bash gegenüber. Vielen Dank Michael Höller
* Michael Hoeller
ich habe ein Problem mit ein paar Zeilen in einem backup script..
Wenn die Datei in $1 existiert und älter als 7 Tage ist dann soll diese nach TMPDIR verschoben und der (backup)level auf null gesetzt werde. Ansonsten soll der Wochentag den level angeben.
#!/bin/sh if [ -r $1 ] && [ 'find -mtime +7'=$1 ]; then mv $1 $TMPDIR level=0 else level=date +%w fi exit 0 HTH Gruesse, Peter -- Remember: Only the really bad things are made by Microsoft, everything else is stolen or bought from (sometimes) innovative and productive companies. [Melchior Franz]
* Peter Rudek
* Michael Hoeller
[010825 00:33]: ich habe ein Problem mit ein paar Zeilen in einem backup script..
Wenn die Datei in $1 existiert und älter als 7 Tage ist dann soll diese nach TMPDIR verschoben und der (backup)level auf null gesetzt werde. Ansonsten soll der Wochentag den level angeben.
#!/bin/sh if [ -r $1 ] && [ 'find -mtime +7'=$1 ]; then mv $1 $TMPDIR level=0 else level=date +%w fi exit 0
ui, war wohl gestern etwas spaet, sollte so aussehen ;) #!/bin/sh # uncommend the following line after editing #TMPDIR=fasel if [ `find -mtime +7` = "./"$1 ] ; then mv $1 $TMPDIR level=0 else level= date +%w fi echo $level exit 0 mehr Kosmetik ist natuerlich moeglich.... Gruesse, Peter -- "Apparently giving caffeine to spiders makes them spin really bad webs, whereas giving them LSD makes them more uniform and better. Imagine what the WWW would have been like if it had been invented in the 60's" --- Richard Letts in the Monastery
* Michael Hoeller schrieb am 25.Aug.2001:
Wenn die Datei in $1 existiert und älter als 7 Tage ist dann soll diese nach TMPDIR verschoben und der (backup)level auf null gesetzt werde. Ansonsten soll der Wochentag den level angeben.
Hier mein Versuch der nicht tut, kann mir jemand helfen? Leider bin ich mit man bash, man date, man ... nicht so ganz zum Ziel gekommen.
if [ -r $1] && [find $1 -mtime +7 \; ]; then
Nehmen wir mal den ersten Teil: [ -r $1] Zuerst wird hier nicht auf die Existenz, sondern auf die Lesbarkeit getestet. Das ist nicht unbedingt das Gleichen, eine Datei könnte sehr wohl existieren, aber nicht lesbar sein. Dann sollte verstanden werden, daß [...] keine syntaktische Rafinesse ist, sondern ein eigener Befehl, der auch test -r $1 geschrieben werden könnte. Allerdings müßte es [ -r $1 ] heißen. Der Blank zwichen $1 und ] ist notwendeig. Wenn $1 existiert und lesbar ist, geht es nach dem && weiter, ansonsten schlägt das if schon hier fehl und es wird der else-Teil ausgeführt. Ist das so gewollt? Wenn $1 nicht existiert, oder nicht lesbar ist, dann wird level auf dem jeweiligen Wochentag gesetzt? Wenn aber die Datei existiert und lesbar ist, dann geht es nach dem && weiter. Was soll das [...] hier bewirken? Wie gesagt, [...] ist ein eigener Befehl, wäre es zumindest, wenn da [ find ... also mit einem Blank danach stände. Hier sucht die shell nach einem Befehl [find, wird ihm aber wahrscheinlich nicht finden. Wohlbemerkt [find und nicht find. stände da aber [ find ... so würde das auch keinen Sinn ergeben. find würde nicht als Befehl angesehen, sondern als erstes Argument von [ ... ] resp. test, was ja ein Synonym zu [ ... ] ist, interpretiert. Du müßtes find in ` setzen. ` und nicht '. Allerdings muß das \; weg. Das gehört zum -exec im find. Aber -exec benutzt Du gar nicht. Richtig wäre [ `find $1 -mtime +7` ] Beachte die Leerzeichen nach [ und vor ]. Vor [ muß auch eins stehen, denn wie gesagt [ ist ein eigeständiger Befehl, der unter anderem folgende Syntaxregel hat: Gibt es genau ein Argument, so wird wahr zurückgegeben, gibt es gar kein Argument, so wird falsch zurückgegeben. Nun gibt find genau ein Argument, nämlich $1 zurück, wenn die mtime älter als 7 Tage ist. Dann ist die Aussage wahr und zusammen, mit dem ersten Teil, der auch wahr sein muß, sonst würde das find gar nicht ausgeführt, ist insgesammt die Bedingung des if wahr und der then-Teil wird ausgeführt. Wenn umgekehrt die Datei jünger als 7 Tage ist, dann gibt find nichts zurück und [ ... ] wird dadurch unwahr und damit auch die Bedingung des if, es wird der else-Teil zurückgegeben. Das ganze verhält sich aber nur so, wenn in $1 nur ein Wort steht, das heißt, im Namen der Datei kein Blank auftaucht. Sollte es doch so sein, so muß noch was mehr gemacht werden: if [ "$1" ] && [ "`find \"$1\" -mtime +7`" ] then Daran erkennt man wie blöde es ist, wenn eine Datei ein Leerzeichen enthalten kann. Man sollte einerseits damit rechnen, das es so sein könnte, andererseits tunlichst vermeiden, daß eine Datei ein Leerzeichen enthält, denn es könnte sein, daß irgendjemand irgendwo nicht ganz aufgepaßt hat. So nun zum then-Teil selber:
mv $1 TMPDIR
Meinst DU TMPDIR? Oder nicht mehr $TMPDIR? Soll doch bestimmt eine Variable sein, dann muß es $TMPDIR heißen. Bei der bash wird eine Variable aufgerufen indem man ein $ davor setzt. Bei der Definition der Variablen darf das $ nicht davor stehen. VAR=irgendwas echo $VAR dann bekomst Du irgendwas. Mit echo VAR bekommst Du das Wort VAR ausgegeben und nicht den Inhalt der Variablen. Mit $VAR=irgendwas bekommst Du eine Fehlermeldung. So wie das da oben steht, wird die Datei in TMPDIR umbenannt. Also nicht nach dem Inhalt der Variablen TMPDIR, sondern die Datei wird TMPDIR heißen, bzw. in das Verzeichnis TMPDIR gelegt, falls es im aktuellen Verzeichnis ein solches Unterverzeichnis gibt. Ich gehe mal davon aus, daß das so nicht gewollt ist.
level=0
Das war noch vom then-Teil, und jetzt kommt der else-Teil:
else level= date +%w fi
Der Variablen level wird der heutige Wochentag zugewiesen? Ist das richtig? Dir ist bewußt, daß der Sonntag die Nummer 0 erhält? Sonntags unterscheidet sich damit das Ergebnis nicht, egal wie alt die Datei ist. Bernd -- LILO funktioniert nicht? Hast Du /etc/lilo.conf verändert und vergessen, lilo aufzurufen? Ist Deine /boot-Partition unter der 1024 Zylindergrenze? Bei anderen LILO Problemen mal in der SDB nachschauen: http://localhost/doc/sdb/de/html/rb_bootdisk.html |Zufallssignatur 6
Am Samstag, 25. August 2001 06:46 schrieb Bernd Brodesser: Hallo, vielen Dank für die Tipps, nun laeuft das script - ein paar Fragen sind da noch offen geblieben:
test, was ja ein Synonym zu [ ... ] ist, Wo kann ich so was erfahren? In man test steht das nichts und ich waere nicht so schnell auf die Idee gekommen unter test zu suchen weil ich's nicht kannte. Aus den existierenden script konnte ich nur schliessen das es so was wie ein test sein musste... Meine Frage sollte wohl lauten wo gibt's Hilfe zur Selbsthilfe? Ich habe mir diverse Dokus runter geladen, abgesehen von denen die schon bei SuSE dabei sind - alles zusammen gibt ja auch ein klares Bild wenn man mal die erste Hürde hat. Einiges ist wohl ehr für Leute gedacht die diese schon genommern haben....
if [ "$1" ] && [ "`find \"$1\" -mtime +7`" ] then
if [ "$1" ] wenn ich auf existenz pruefe, sollte das dann nicht [ -e "$1" ] heissen? Was macht [ "$1" ] ? Oder ist das wieder ein Synonym?
[ "`find \"$1\" -mtime +7`" ] mtime bezieht sich auf last modified, ctime auf last changed ich wuerde gerne auf das Erstelldatum pruefen - was muss ich da nehmen?
ARCHIV="/backup/archiv" TMPDIR="/tmp/backup" mv $ARCHIV $TMPDIR\$ARCHIV wie kann ich erreichen das nicht nach /tmp/backup/backup/archiv gemoved wird sondern nach /tmp/backup/archiv? Irgendwo habe ich gelesen das man den Filename extrahieren kann - ich find's nur nicht mehr.. und zu letzt: In einigen scripten habe ich so was gefunden: if [ ....] ; then ... else ... fi es scheint aber auch so zu gehen: if [...] then ... else ... fi mal abgesehen von der Position des then, das ist wohl eine Frage der Lesbarkeit, was ist mir dem Semikolon? Alles Gute Michael
* Michael Hoeller
Am Samstag, 25. August 2001 06:46 schrieb Bernd Brodesser:
vielen Dank für die Tipps, nun laeuft das script - ein paar Fragen sind da noch offen geblieben:
test, was ja ein Synonym zu [ ... ] ist, Wo kann ich so was erfahren? In man test steht das nichts und ich waere nicht so schnell auf die Idee gekommen unter test zu suchen weil ich's nicht kannte. Aus den existierenden script konnte ich nur schliessen das es so was wie ein test sein musste... Meine Frage sollte wohl lauten wo gibt's Hilfe zur Selbsthilfe? Ich habe mir diverse Dokus runter geladen, abgesehen von denen die schon bei SuSE dabei sind - alles zusammen gibt ja auch ein klares Bild wenn man mal die erste Hürde hat. Einiges ist wohl ehr für Leute gedacht die diese schon genommern haben....
vielleicht hier: /usr/share/doc/howto/en/html/Bash-Prog-Intro-HOWTO.html oder, wenn Du einen Einstieg (@Linux) brauchst: 'Der Koffler' ISBN 3-8273-1658-8 etwas 'abgehobener', aber sehr gut: 'LinuxAnwenderHandbuch' ISBN 3-929764-06-7 guenstig, 'abgehoben', gut zum Nachschlagen: Linux°Unix Kurzreferenz ISBN 3-8273-1536-0 und ganz begeistert bin ich z.Zt. von: Linux Programmierung ISBN 3-8266-0569-1 just my 2¢
if [ "$1" ] && [ "`find \"$1\" -mtime +7`" ] then
if [ "$1" ] wenn ich auf existenz pruefe, sollte das dann nicht [ -e "$1" ] heissen? Was macht [ "$1" ] ? Oder ist das wieder ein Synonym?
schau: #!/bin/sh if [ $1 ] #haben wir ein Argument? then echo Du hast $1 eingegeben else echo Eingabe her\! exit 1 fi if [ -e "$1" ]; then echo Deine Eingabe:$1 existiert else echo Noe, $1 hammer net ";)" exit 1 fi exit 0
[ "`find \"$1\" -mtime +7`" ] mtime bezieht sich auf last modified, ctime auf last changed ich wuerde gerne auf das Erstelldatum pruefen - was muss ich da nehmen?
hmm, Erstellungdatum, keine Ahnung.... Bernd???
ARCHIV="/backup/archiv" TMPDIR="/tmp/backup" mv $ARCHIV $TMPDIR\$ARCHIV ^^^ fipptehler? oder mir unbekannt ;) <FrauBashExpandiert> mv /backup/archiv /tmp/backup/backup/archiv </FrauBashExpandiert>
wie kann ich erreichen das nicht nach /tmp/backup/backup/archiv gemoved wird sondern nach /tmp/backup/archiv? Irgendwo habe ich gelesen das man den Filename extrahieren kann - ich find's nur nicht mehr..
man basename ??
und zu letzt: In einigen scripten habe ich so was gefunden:
if [ ....] ; then ... else ... fi
es scheint aber auch so zu gehen:
if [...] then ... else ... fi
mal abgesehen von der Position des then, das ist wohl eine Frage der Lesbarkeit, was ist mir dem Semikolon?
$ for i in *;do echo $i;done ist identisch zu: $ for i in *
do echo $i done
nur in einer Zeile ;) Hau rein, Gruesse, Peter -- - Macs sind für die, die nicht wissen wollen, warum Ihr Rechner funzt. - Linux ist für die, die wissen wollen, warum er funzt. - DOS ist für die, die wissen wollen, warum er nicht funzt, und - Windows ist für die, die nicht wissen wollen, warum er nicht funzt.
On Sam, 25 Aug 2001, Peter Rudek wrote:
* Michael Hoeller
[010825 17:27]: Wo kann ich so was erfahren? In man test steht das nichts und ich waere nicht
'test' ist $ type -a test test is a shell builtin test is /usr/bin/test 1. ein binary dessen manpage 'man test' ist 2. aber auch ein bash-builtin, zu welchem es 'man bash' und 'man bashbuiltins' zu lesen gilt. Einfacher ist aber: help test Und tata *g*: $ help [ [: [ arg... ] This is a synonym for the "test" builtin, but the last argument must be a literal `]', to match the opening `['. $ help help help: help [pattern ...] Display helpful information about builtin commands. If PATTERN is specified, gives detailed help on all commands matching PATTERN, otherwise a list of the builtins is printed.
hmm, Erstellungdatum, keine Ahnung....
Aus /usr/src/linux/include/linux/ext2_fs.h: struct ext2_inode { /* ... */ __u32 i_atime; /* Access time */ __u32 i_ctime; /* Creation time */ __u32 i_mtime; /* Modification time */ __u32 i_dtime; /* Deletion Time */ /* ... */ }; Es ist also "ctime" die gewuensche Zeit...
ARCHIV="/backup/archiv" TMPDIR="/tmp/backup" mv $ARCHIV $TMPDIR\$ARCHIV ^^^ fipptehler? oder mir unbekannt ;)
mv "${ARCHIV}" "${TMPDIR}`basename ${ARCHIV}`" alternativ aber bash-spezifisch und afair nicht portabel sowie IIRC anfaellig fuer Leerzeichen o.ae.: mv "$ARCHIV" "${TMPDIR}${ARCHIV##*\/}" -dnh -- Das höhrt sich an, wie die Beschreibung eines Dildos für gewesene Jungfrauen. [WoKo in dafb]
* Michael Hoeller schrieb am 25.Aug.2001:
Am Samstag, 25. August 2001 06:46 schrieb Bernd Brodesser:
test, was ja ein Synonym zu [ ... ] ist,
Wo kann ich so was erfahren? In man test steht das nichts und ich waere nicht so schnell auf die Idee gekommen unter test zu suchen weil ich's nicht kannte. Aus den existierenden script konnte ich nur schliessen das es so was wie ein test sein musste... Meine Frage sollte wohl lauten wo gibt's Hilfe zur Selbsthilfe? Ich habe mir diverse Dokus runter geladen, abgesehen von denen die schon bei SuSE dabei sind - alles zusammen gibt ja auch ein klares Bild wenn man mal die erste Hürde hat. Einiges ist wohl ehr für Leute gedacht die diese schon genommern haben....
man bash. test gibt es zwar aus historischen Gründen auch als eigenständiges Programm, aber wenn Du einfach test oder eben [...] sagst, dann ist das bash-buildin gemeint. Eine knappe Hilfe speziell zu test bekommst Du auch mit help test. Wenn Du Dich intensiv mit der shell befassen willst, kommst Du nicht umhin Dir ein gutes Buch zuzulegen. Da gibt es eine ganze Menge. Geh mal in einem Buchladen und stöbere ein wenig durch. Die Manpages sind natürlich zum nachschlagen, nicht zum lernen gedacht.
if [ "$1" ] && [ "`find \"$1\" -mtime +7`" ] then
if [ "$1" ]
wenn ich auf existenz pruefe, sollte das dann nicht [ -e "$1" ] heissen? Was
Richtig.
macht [ "$1" ] ? Oder ist das wieder ein Synonym?
Wahr wohl ein falscher Fehler von mir. Sorry. Es war [ -e "$1" ] gemeint. [ "$1" ] gibt wahr zurück, wenn $1 nicht leer ist, sonst falsch.
[ "`find \"$1\" -mtime +7`" ]
mtime bezieht sich auf last modified, ctime auf last changed ich wuerde gerne auf das Erstelldatum pruefen - was muss ich da nehmen?
Gibt's nicht. mtime gibt die letzte Änderung in der Datei selber an, ctime die letzte Änderung in der I-Node. Das heißt wenn z.B die Rechte geändert wurden, oder der Besitzer. atime gibt den letzten lesenden Zugriff an.
ARCHIV="/backup/archiv" TMPDIR="/tmp/backup" mv $ARCHIV $TMPDIR\$ARCHIV ^ was soll hier der Backslash? Du meinst sicherlich auch hier slash / oder?
wie kann ich erreichen das nicht nach /tmp/backup/backup/archiv gemoved wird sondern nach /tmp/backup/archiv? Irgendwo habe ich gelesen das man den Filename extrahieren kann - ich find's nur nicht mehr..
basename und der Pfadanteil bekommst Du mit dirname.
und zu letzt: In einigen scripten habe ich so was gefunden:
if [ ....] ; then ... else ... fi
es scheint aber auch so zu gehen:
if [...] then ... else ... fi
mal abgesehen von der Position des then, das ist wohl eine Frage der Lesbarkeit, was ist mir dem Semikolon?
Semikolon beendet einen Befehl, das kann man auch mit Zeilenende machen. Ist reine Geschmackssache. Bernd -- Homepages von deutschsprachigen Linux-Gurus: Kristian Köhntopp: http://www.koehntopp.de/kris/artikel/ Sven Guckes: http://www.math.fu-berlin.de/~guckes/sven Robin S Socha: http://socha.net/index2.html |Zufallssignatur 10
participants (4)
-
B.Brodesser@t-online.de
-
David Haller
-
MichaelHoeller@t-online.de
-
Peter Rudek