timestamp einer Datei ausgeben lassen

Lord_Icon

Member
Hat einer eine Idee, wie ich mit den Zeitstempel einer Datei anzeigen lassen kann ?

nur die Zeit. ICh brauche das in einer Variable.

Dir bringt mir da nicht viel.
wc bringt mir auch nicht viel.


Einer eine Idee ?
 
Hi,

Code:
stat -c %y mail.php
Das gibt dir das letzte modify-date aus. Eventuell musst Du das für Deine Zwecke noch entsprechend anpassen :)


-W
 
vielen Dank Ihr beiden.

wstuermer war für mich der ausschlagende Faktor.

Für diejeigen, die es Interessiert:


Code:
name=`stat -c %y /etc/postfix/virtual | cut -f2 -d' ' | cut -c1-8`
echo $name
14:22:10

cut -c1-6 = schneide es auf 14:22

Bei CentY sieht es so aus:
Code:
ls -l --time-style=long-iso virtual | cut -d ' ' -f6-7
2008-12-03 14:22
 
hmm... brauch doch nochmal Hilfe

Script:
Code:
#!/bin/bash


ksvirtusertable=`stat -c %y /etc/postfix/ksvirtusertable | cut -f2 -d' ' | cut -c1-8`
ksvirtusertable_db=`stat -c %y /etc/postfix/ksvirtusertable.db | cut -f2 -d' ' | cut -c1-8`

echo $ksvirtusertable

if [`$ksvirtusertable` -gt `$ksvirtusertable_db`]
then
  exit
        echo "gleich"
else
        echo "ungleich"
fi

Ausgabe:
00:07:01
00:07:40
./test: line 10: 00:07:01: command not found
./test: line 10: 00:07:40: command not found

Wo liegt denn der Fehler ?
 
Hi,

ersetze
Code:
if [`$ksvirtusertable` -gt `$ksvirtusertable_db`]
durch
Code:
if [$ksvirtusertable -gt $ksvirtusertable_db]

Ohne Garantie, aber `` ist schonmal definitiv falsch an der Stelle. Alles innerhalb der ``-Tags wird so behandelt, als ob Du es direkt auf der Shell eingeben würdest.


-W
 
DAS hatte ich anfänglich drin gehabt.

Da hab ich aber immer:

./test: line 9: [00:07:01: command not found
ungleich

erhalten.

Irgendwie werden die beiden Felder nicht verglichen sondern als Befehl interpretiert.

00:07:01 = ist ksvirtusertable
 
Hi,

nach kurzem Blick ins man-file von 'test':

-gt vergleicht Integer-Werte, also Ganzzahlen. Die Bereichseingrenzung ist dabei irrelevant.
Du übergibst einen Wert aĺa "21:00:05" oder so. Das ist kein Integer sondern ein String.
Versuch mal folgendes:
Code:
if [$ksvirtusertable = $ksvirtusertable_db]


-W
 
Hi,

dann steige ich "regionsbedingt" an dieser Stelle aus ;)
Sorry, dass wir keine direkte Lösung finden konnten.


-W
 
na nicht doch...

Ohne dich wär ich doch garnicht an dieser Stelle :->

Ich versuchs mal weiter und poste dann.... vielleicht kommt mir ja auch einer zuvor und hat noch eine Idee
 
name=`stat -c %y /etc/postfix/virtual | cut -f2 -d' ' | cut -c1-8`

Warum eigentlich so umständlich?

Code:
if [ `date +%r -r/etc/postfix/virtual` != `date +%r -r/etc/postfix/virtual.db` ] ; then
 echo -n "un"
fi
echo "gleich"

Hat es eigentlich einen Sinn, daß Du das Datum nicht mit vergleichen willst?

Code:
if [ /etc/postfix/virtual -nt /etc/postfix/virtual.db ] ; then
 echo "need to update db"
fi
klingt logischer :)
 
Zur Erklärung, weshalb Whistlers Variante funktioniert: [ ist ein Alias (i. d. R. symbolischer oder harter Link) auf test. Daher muss nach dem [ ein Leerzeichen kommen, da das Kommando sonst nicht gefunden wird. [foo ist äquivalent zu testfoo.
 
oki... ich hab mein Script soweit fertig.

Auf der Shell pr Hand ausgeführt = klappt mal wieder alles.

Packe ich es in cron => wie üblich Fehler.
Dabei hab ich mich an die altbekannten Fehler die man machen kann extra berücksichtigt.

Code:
[B]#vi  /root/cronjobs/email_adressen_abgleichen[/B]

#!/bin/bash
if [ `/bin/date +%r -r/etc/postfix/localdomains` != `/bin/date +%r -r/etc/postfix/localdomains.db` ] ;
then
 /usr/sbin/postmap /etc/postfix/localdomains
 /usr/bin/find /etc/postfix/ -name localdomains -exec /usr/bin/touch -r /etc/postfix/localdomains.db {} \;
 echo "localdomains abgeglichen"
fi


if [ `/bin/date +%r -r/etc/postfix/virtusertable` != `/bin/date +%r -r/etc/postfix/virtusertable.db` ] ;
then
 /usr/sbin/postmap /etc/postfix/virtusertable
 /usr/bin/find /etc/postfix/ -name virtusertable -exec /usr/bin/touch -r /etc/postfix/virtusertable.db {} \;
 echo "virtusertable abgeglichen"
fi

Code:
[B]#crontab -e[/B]
*/1  * * * *  /root/cronjobs/email_adressen_abgleichen

Code:
chmod +x  /root/cronjobs/email_adressen_abgleichen

Wie gesagt. Ausgeführt per Hans = works.
PEr Cron:
/root/cronjobs/email_adressen_abgleichen: line 2: [: too many arguments
/root/cronjobs/email_adressen_abgleichen: line 10: [: too many arguments

Was für ein Problem hat Cron denn hier ?


P.s. Wer es selbst testen möchte:
Hiermit werden virtusertable & localdomains auf die Zeit von der Datei main.cf gesetzt. (Is wohl eher unwarscheinlich, das diese den gleichen Timestamp haben)

Code:
find /etc/postfix/ -name virtusertable -exec touch -r /etc/postfix/main.cf {} \;
find /etc/postfix/ -name localdomains -exec touch -r /etc/postfix/main.cf {} \;


Vielen Dank
 
Ein vorsichtiger Blick in die Scriipte unter /etc/cron.daily zeigt, daß dies nicht die Ursache ist - dort wird reichlich vom [ Gebrauch gemacht.

Hauptgrund dafür, daß ein Script unter Benutzeraccounts läuft, im Cron jedoch nicht, sind die fehlenden bzw. anders gesetzten Profilvariablen.

Suse leitet daher seine Scripte recht einheitlich mit
Code:
#!/bin/sh

#
# paranoia settings
#
umask 022

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

if [ -f /etc/sysconfig/wasauchimmer ] ; then
    . /etc/sysconfig/wasauchimmer
fi
ein.

PS: Zor Info noch ein Zitat aus einem alten SuSE-Script:
Code:
#! /bin/sh
# Copyright (c) 1997-2001 SuSE GmbH Nuernberg, Germany.
# Author: Florian La Roche
#         Werner Fink      <feedback@suse.de>
[...]
    test -e /etc/mail/virtusertable && \
        if test /etc/mail/virtusertable -nt /etc/mail/virtusertable.db \
                -o ! -e /etc/mail/virtusertable.db ; then
                echo "Rebuilding /etc/mail/virtusertable.db."
                makemap hash ${nofold} /etc/mail/virtusertable.db < /etc/mail/virtusertable
                test -e /etc/mail/virtusertable.db && touch /etc/mail/virtusertable.db
        fi
[...]
 
Was für ein Problem hat Cron denn hier ?
Gar keins. Und du willst dich in die Grundlagen des Shellscriptings einlesen. Wenn du das gemacht hast, willst du den ABS lesen.

Code:
`/bin/date +%r -r/etc/postfix/localdomains`
Dieser Ausdruck (und auch der in dem Skript folgende) wird bei dir zu einer Zeichenkette aufgelöst, die Leerzeichen enthält (z. B. weil kein Zugriff auf die Datei möglich ist o. ä.). Da keine doppelten Anführungszeichen um den Ausdruck stehen, werden Zeichenketten mit Leerzeichen als zwei oder mehr Argumente gewertet und das passt nicht zur Syntax von test. Entweder du setzt korrekt die Anführungszeichen oder benutzt den extra für deinen Fall vorhandenen Test, den Whistler schon genannt hat.

In solchen Fällen ist auch `set -x` in den Skripten nützlich. Aber wie gesagt: Grundlagen anlesen und ABS durcharbeiten...
 
Nur der Vollständigkeithalber, falls mal ein User, der das gleiche Problem hat tatächlich mal die Forum Suche bemühen sollte :->

Was tut das Script:
Gleicht die beiden Datein:
kslocaldomains
ksvirtusertable
anhand des Datums ab. Wenn Datei neuer als die *.db wird postmap ausgeführt. Danach wird die *.db Datei den gleichen Zeitstempel erhalten wie die normale Datei um beim nächsten Durchlauf ein = zu erhalten.

(Ich weiß... den Zeitstempel-Befehl kann mit irgendein anderen Befehl kürzer gehalten werden)

Code:
#!/bin/bash
umask 022

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH

kslocaldomains=`date +%r -r/etc/postfix/kslocaldomains`
kslocaldomains_db=`date +%r -r/etc/postfix/kslocaldomains.db`

ksvirtusertable=`date +%r -r/etc/postfix/ksvirtusertable`
ksvirtusertable_db=`date +%r -r/etc/postfix/ksvirtusertable.db`

if  [ "$kslocaldomains" != "$kslocaldomains_db" ];
then
 postmap /etc/postfix/kslocaldomains
 find /etc/postfix/ -name kslocaldomains -exec touch -r /etc/postfix/kslocaldomains.db {} \;
 echo "kslocaldomains abgeglichen"
fi


if  [ "$ksvirtusertable" != "$ksvirtusertable_db" ];
then
 postmap /etc/postfix/ksvirtusertable
 find /etc/postfix/ -name ksvirtusertable -exec touch -r /etc/postfix/ksvirtusertable.db {} \;
 echo "ksvirtusertable abgeglichen"
fi
 
Back
Top