# Shell Script, -->  ich bräuchte mal Hilfe.

## 3PO

Hallo Zusammen,

ich bräuchte mal Hilfe, bei der Erstellung eine Scripts.

Wie herausfinden welche Datei neuer ist als eine andere?

z.B:

Ich habe 2 Dateien: datei1.txt und datei2.txt

Wie kann ich nun herausfinden welche der beiden Dateien neuer ist?

Und falls datei1.txt neuer ist als datei2.txt, soll datei2.txt nach z.B. /var/xyz kopiert werden.

Geht das überhaupt, und falls ja, wie?

Bin über jeden Tipp dankbar.

cu

3PO

----------

## c_m

ls -t      <- sortiert nach der Zeit: abwärts

ls -tr      <- sortiert nach der Zeit: aufwärts

----------

## Finswimmer

tobi-lap ~ # stat -c %z /tmp/test

2006-04-09 13:31:47.958208750 +0200

Das ist "Time of last change".

Das bei beiden und ein einfaches [], also Test. Damit hast dus.

Tobi

----------

## 3PO

Danke erstmal für die schelle Hilfe, leider bring mich das nicht wirklich weiter.

@ c_m

Dass ls -t die Dateien in einem Verzeichnis nach "last Change" sortiert ist schon klar.

Ich möchte aber 2 Dateien, und NUR 2 Dateien, miteinander vergleichen.

Und WENN die Eine neuer ist als die Andere, DANN soll eine Aktion ausgeführt werden, z.B: cp -f datei2.txt /var/xyz.

@ Finswimmer

Dein Posting verstehe ich überhaut nicht. --> Das liegt aber sicherlich am mir.   :Very Happy: 

----------

## toralf

```
tfoerste@n22 ~/tmp $ touch alt; sleep 2; touch neu; [[ alt -nt neu ]] && echo yup || echo yep

yep

```

----------

## Finswimmer

 *Finswimmer wrote:*   

> tobi-lap ~ # stat -c %z /tmp/test
> 
> 2006-04-09 13:31:47.958208750 +0200
> 
> Das ist "Time of last change".
> ...

 

stat -c gibt dir die Zeit aus, wann die Datei das letzte Mal verändert wurde.

Das kannst du nun bei beiden Dateien machen und bekommst zwei Zeiten.

Die musst du nun vergleiche, das geht mit test.

Anschließend noch eine if Schleife dran, damit du auch steuern kannst, was passieren soll.

Wobei die Variante von toralf die schnellere ist.

Tobi

----------

## 3PO

Danke nochmal an Alle.

Die Variante von funtioniert soweit ganz gut.

Allerdinge hätte ich noch eine Frage dazu:

 *Quote:*   

> touch alt; sleep 2; touch neu; [[ alt -nt neu ]] && echo yup || echo yep 

 

Mir ist nur noch nicht ganz klar, was der rote Teil macht?

@ Finswimmer,

Danke auch an Dich.

Leider hatte ich vergessen zu erwähnen, dass es hier um eine Busybox handelt, und die kennt den Befehl stat leider nicht.

----------

## Finswimmer

 *Quote:*   

>        DATEI1 -nt DATEI2
> 
>               DATEI1 ist neuer (Anderungsdatum) als DATEI2

 

Aus der Man-Datei von test

Wenn nun [[ alt -nt neu ]] stimmt, dann wird echo yup ausgeführt, ansonsten echo yep.

Wobei ich das so nicht gut finde. Was wäre, wenn es alt/neu nicht gibt, dann ist der Test falsch, und es wird yep ausgegeben.

Aber das liegt mit Sicherheit am Anwendergebiet.

Tobi

----------

## Knieper

In der zsh muesste es so aussehen: cp datei<i-j>.txt(Om[1]) ziel. Um zB. die aelteste aller Dateien zu kopieren:

```
cp *(Om[1]) ziel
```

oder um aus einer Liste von Dateien datei0.txt bis datei100.txt die drei aeltesten aus dem Bereich datei49.txt bis datei57.txt zu kopieren:

```
cp datei<49-57>.txt(Om[1,3]) ziel
```

a access time

m modification time

c inode change time

[Allerdings habe ich es nicht ausprobiert.]

Edit: Den Busyboxteil hatte ich ganz ueberlesen. Dann sollten die Doppelklammern [[, ]] durch [ und ] ersetzt werden und die Dateien sollten auch existieren.Last edited by Knieper on Thu Aug 09, 2007 11:29 am; edited 2 times in total

----------

## toralf

 *Finswimmer wrote:*   

>  *Quote:*          DATEI1 -nt DATEI2
> 
>               DATEI1 ist neuer (Anderungsdatum) als DATEI2 
> 
> Aus der Man-Datei von test
> ...

 ok: 

```
[[ -f alt && -f neu ]] && [[ alt -nt neu ]] && echo yup || echo yep
```

----------

## 3PO

Wie gesagt die Variante von funtioniert soweit ganz gut.

nur leider habe ich keinen Plan, wie diese in eine IF, THEN, ELSE,-Schleife einbauen kann.

Oder geht das so:

```
if [[ -f alt && -f neu ]] && [[ alt -nt neu ]]

then

 echo yup 

else

 echo yep

fi
```

----------

## Knieper

 *3PO wrote:*   

> IF, THEN, ELSE,-Schleife

 

if ist keine Schleife, sondern eine Verzweigung.

 *Quote:*   

> Oder geht das so:

 

Gemaess busybox eher:

```

if [ neu -nt alt ]

        then cp alt ziel

        else cp neu ziel

fi

```

----------

## 3PO

Also irgenwie kreige ich das nicht gebacken....

Stimmt das so?

```
.....

touch $alt; sleep 2; touch $neu;

if [ neu -nt alt ] 

        then cp $neu /var/xyz 

        else cp $neu /var/abc 

fi 

.....
```

----------

## Knieper

 *3PO wrote:*   

> 
> 
> ```
> .....
> 
> ...

 

Weisst Du ueberhaupt, was sleep und touch machen?

----------

## 3PO

touch lege eine Datei an, falls diese nicht existiert.

sleep, ist eine warteschleife.

...Denke ich mal.

----------

## Knieper

Und wieso willst Du die in Deinem Skript haben? Was fehlt Dir denn noch? Die Uebergabe der Parameter an das Skript?

----------

## 3PO

Also irgenwie kreige ich das nicht gebacken....

Stimmt das so?

```
.....

touch $alt; sleep 2; touch $neu;

if [ neu -nt alt ] 

        then cp $neu /var/xyz 

        else cp $neu /var/abc 

fi 

.....
```

----------

## aleph-muc

Die Zeile

```
touch alt; sleep 2; touch neu
```

ist nur, um die Funktionsweise zu verdeutlichen und ein funktionierendes Beispiel zu schaffen.

Wenn Du diese Zeile mit in Dein Skript einbaust, trifft die Bedingung immer zu und Du kannst es gleich bleiben lassen.

Gruß

aleph

----------

## Knieper

Angenommen Du hast folgende Dateien:

```

>lst

12:27 datei2.txt

12:28 datei3.txt

12:29 datei1.txt

```

speicherst folgendes Skript unter dem Namen paul:

```

#!/bin/sh

if [ $1 -nt $2  ]

        then cp $2 $3

        else cp $1 $3  

fi

```

machst es ausfuehrbar (Partition muss ausfuehrbaren Code erlauben):

```

>chmod u+x paul

```

und fuehrst es im obigen Verzeichnis aus:

```

>./paul datei1.txt datei3.txt ziel

```

Dann wird datei3.txt nach ziel kopiert, weil die Datei aelter ist, als datei1.txt - und das war glaube ich die Aufgabe.

----------

## 3PO

@ Knieper,

danke, besser kann man das, glaube ich, nicht erklären. --> Top.

Allerdings habe ich noch ein kleines Problem:

Mit [ $1 -nt $2  ] wird "last modified" genommen.

Gibt es eine Möglichkeit stattdessen das Erstellungsdatum zu nehmen?

----------

## Knieper

 *3PO wrote:*   

> @ Knieper,
> 
> Gibt es eine Möglichkeit stattdessen das Erstellungsdatum zu nehmen?

 

Wird das irgendwo gespeichert?

----------

## 3PO

 *Knieper wrote:*   

>  *3PO wrote:*   @ Knieper,
> 
> Gibt es eine Möglichkeit stattdessen das Erstellungsdatum zu nehmen? 
> 
> Wird das irgendwo gespeichert?

 

Bei Micro$oft ja, bei linux weis ich es nicht

----------

## firefly

 *Knieper wrote:*   

>  *3PO wrote:*   @ Knieper,
> 
> Gibt es eine Möglichkeit stattdessen das Erstellungsdatum zu nehmen? 
> 
> Wird das irgendwo gespeichert?

 

jo denn für jede datei wird die atime (wann der letzte zugriff war), ctime (erstelldatum) und mtime (wann die datei zuletzt modifiziert wurde) gespeichert

----------

## firefly

 *3PO wrote:*   

> Danke nochmal an Alle.
> 
> Die Variante von funtioniert soweit ganz gut.
> 
> Allerdinge hätte ich noch eine Frage dazu:
> ...

 

öhm busybox kennt sehr wohl den befehl stat(http://busybox.net/downloads/BusyBox.html).

----------

## Knieper

 *firefly wrote:*   

> 
> 
> jo denn für jede datei wird die atime (wann der letzte zugriff war), ctime (erstelldatum) und mtime (wann die datei zuletzt modifiziert wurde) gespeichert

 

Die ctime ist (s. oben) die inode change time. Mach mal ein chown, schreib etwas rein etc. und Dein "Erstelldatum" ist futsch.

----------

## 3PO

 *firefly wrote:*   

> .....
> 
> öhm busybox kennt sehr wohl den befehl stat(http://busybox.net/downloads/BusyBox.html).

 

Meine aber nicht.

Guckst Du:

```
 ~ # busybox

BusyBox v1.2.1 (2007.03.23-17:15+0000) multi-call binary

Usage: busybox [function] [arguments]...

   or: [function] [arguments]...

        BusyBox is a multi-call binary that combines many common Unix

        utilities into a single executable.  Most people will create a

        link to busybox for each function they wish to use and BusyBox

        will act like whatever it was invoked as!

Currently defined functions:

[, [[, ash, awk, basename, bunzip2, busybox, bzcat, cat, chmod, clear, cp, cut, date, dd, df, dmesg, dos2unix, du, e2fsck, echo, env, expr, false, fdisk, find, free, fsck, fsck.ext2, fsck.ext3, grep, gunzip, gzip, halt, hostname, ifconfig, ifdown, ifup, inetd, init, insmod, ip, kill, killall, ln, loadkmap, login, ls, lsmod, md5sum, mkdir, mke2fs, mkfs.ext2, mkfs.ext3, mkswap, more, mount, mv, nc, netstat, nslookup, sswd, pidof, ping, poweroff, ps, rdate, reboot, renice, rm, rmdir, rmmod, route, run-parts, sed, setconsole, sh, sleep, swapoff, swapon, sync, sysctl, syslogd, tail, tar, telnet, telnetd, test, time, top, touch, true, udhcpc, umount, uname, unix2dos, uptime, vi, watchdog, wget, xargs, yes, zcat

~ #

```

btw:

 *Quote:*   

> jo denn für jede datei wird die atime (wann der letzte zugriff war), ctime (erstelldatum) und mtime (wann die datei zuletzt modifiziert wurde) gespeichert
> 
> 

 

Diese Befehle gehen bei mir auch nicht.   :Crying or Very sad: Last edited by 3PO on Thu Aug 09, 2007 2:52 pm; edited 1 time in total

----------

## firefly

öhm v 1.2.1 ist auch etwas alt die sind miterlerweile bei v 1.6.1

bzw. hast du die version selbst erstellt?

----------

## 3PO

 *firefly wrote:*   

> öhm v 1.2.1 ist auch etwas alt die sind miterlerweile bei v 1.6.1
> 
> bzw. hast du die version selbst erstellt?

 

Um ganz genau zu sein, es handelt sich um eine DBOX2.

----------

## Knieper

 *3PO wrote:*   

> 
> 
>  *Quote:*   jo denn für jede datei wird die atime (wann der letzte zugriff war), ctime (erstelldatum) und mtime (wann die datei zuletzt modifiziert wurde) gespeichert
> 
>  
> ...

 

Das sind auch keine Befehle  :Wink: . Hilft auch nicht weiter, da (s. letzte Nachricht) keines der drei das Erstellungsdatum ist.

----------

## firefly

 *Knieper wrote:*   

>  *3PO wrote:*   
> 
>  *Quote:*   jo denn für jede datei wird die atime (wann der letzte zugriff war), ctime (erstelldatum) und mtime (wann die datei zuletzt modifiziert wurde) gespeichert
> 
>  
> ...

 

öhm ctime (create time) != Erstellzeitpunkt(bei dem das datum auch dabei ist  :Wink: ) ?

----------

## 3PO

 *Knieper wrote:*   

>  *3PO wrote:*   @ Knieper,
> 
> Gibt es eine Möglichkeit stattdessen das Erstellungsdatum zu nehmen? 
> 
> Wird das irgendwo gespeichert?

 

Gerade gefunden:

 *Quote:*   

> Linux kennt 3 Arten von Zeitstempeln:
> 
> atime
> 
> oder access time, der Zeitpunkt des letzten Zugriffs.  
> ...

 

----------

## Finswimmer

 *Quote:*   

> Eine Änderung der ctime erfolgt auch, wenn der Name der Datei geändert wird.

 

 *Quote:*   

> Es ist für einen Benutzer normalerweise nicht möglich die ctime zu verändern. 

 

Wat?!

----------

## Knieper

 *firefly wrote:*   

> 
> 
> öhm ctime (create time) != Erstellzeitpunkt(bei dem das datum auch dabei ist ) ?
> 
> 

 

Das hatte ich letzte Seite schon geschrieben ctime == inode change time != creation time

 *3PO wrote:*   

> 
> 
>  *Quote:*   
> 
> ctime
> ...

 

Das sollte so nicht stimmen:

```

>touch test

>stat test

...

Access: 2007-08-09 17:12:54.000000000 +0200

Modify: 2007-08-09 17:12:54.000000000 +0200

Change: 2007-08-09 17:12:54.000000000 +0200

>echo "bla" >| test

>stat test

[...]

Access: 2007-08-09 17:12:54.000000000 +0200

Modify: 2007-08-09 17:14:04.000000000 +0200

Change: 2007-08-09 17:14:04.000000000 +0200

```

Edit: Lustig: lesen, schreiben, chown... und access bleibt gleich.

Edit2: Gar nicht lustig, Partition mit noatime gemountet.  :Wink: 

----------

