skriptproblem

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
alexpetri
Beiträge: 49
Registriert: 30.01.2006 14:42:32

skriptproblem

Beitrag von alexpetri » 07.12.2006 13:11:44

Hallo,
ich habe mir ein Skript gebastelt was mir per cronjob aufruf alle 10 min
alle geänderten datein der letzten 10 Minuten in ein neues verzeichnis kopiert
Problem ist das SRC mehrere unterverzeichnisse hat und irgendwie legt er die Unterverzeichnisse nicht an, sondern kopiert alles in eine ebene. wie geht das?

Code: Alles auswählen

#!/bin/sh

# defs
SRC=/var/www/wiki
DST=/var/wiki_backup
T=`date +%F_%H-%M`
NEWDIR=$DST"/"$T

# execute
mkdir $NEWDIR
cd $SRC
find -mmin -10 -exec cp {} $NEWDIR \; 
wenn ich -R hinter cp schreibe kopiert er mir alles...

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 07.12.2006 13:30:23

ungetestet:

Code: Alles auswählen

cd "$SRC"
find -mmin 10 -type f | while read file; do
  DN=`dirname "$file"`;
  [ -d "$DST/$DN" ] || mkdir "$DST/$DN"
  cp "$file" "$DST/$DN/"
done
[edit]
statt DST, solltest/möchtest du wahrscheinlich deine "NEWDIR" variable einsetzen
[/edit]

Gruß
gms

alexpetri
Beiträge: 49
Registriert: 30.01.2006 14:42:32

Beitrag von alexpetri » 07.12.2006 14:31:30

danke
habs mal ein bissl angepasst:

Code: Alles auswählen

#!/bin/sh

# defs
SRC=/var/www/wiki
DST=/var/wiki_backup
T=`date +%F_%H-%M`
NEWDIR=$DST"/"$T

# execute
mkdir $NEWDIR
cd $SRC
find -mmin -10 -type f | while read file; do
	DN=`dirname "$file"`;
	[ -d "$NEWDIR/$DN" ] || mkdir "$NEWDIR/$DN"
	cp "$file" "$NEWDIR/$DN/"
done

cd $NEWDIR
if [ `ls -1a|wc -l` -gt 2 ]; then echo "Verzeichnis angelegt";else rmdir $NEWDIR; fi
in den letzten zeilen wird das verzeichnis wieder gelöscht falls es leer ist- um ein wenig den Überblick zu behalten...

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 07.12.2006 14:50:37

Ist mir gerade noch aufgefallen

Code: Alles auswählen

 [ -d "$NEWDIR/$DN" ] || mkdir "$NEWDIR/$DN"
sollte durch

Code: Alles auswählen

 [ -d "$NEWDIR/$DN" ] || mkdir -p "$NEWDIR/$DN"
ersetzt werden

Das brauchst du eigentlich nicht:

Code: Alles auswählen

mkdir $NEWDIR
und wenn du diese Zeile wegläßt, kannst du dir diese auch ersparen:

Code: Alles auswählen

cd $NEWDIR 
if [ `ls -1a|wc -l` -gt 2 ]; then echo "Verzeichnis angelegt";else rmdir $NEWDIR; fi
Gruß
gms

alexpetri
Beiträge: 49
Registriert: 30.01.2006 14:42:32

Beitrag von alexpetri » 07.12.2006 15:36:26

wozu brauche ich das "-p"
wer aus den man pages nicht so ganz schlau

Benutzeravatar
LessWire
Beiträge: 558
Registriert: 21.11.2004 04:36:04
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Bavaria

Beitrag von LessWire » 07.12.2006 17:10:18

Hilft Dir ein "cp -P" ? Mit grossem P ! Dann sollten eigentlich alle Unterverzeichnisse des SRC-Dirs an das DST-Dir angehängt und die Files entsprechend kopiert werden.
Zuletzt geändert von LessWire am 07.12.2006 19:07:04, insgesamt 1-mal geändert.
at ~ now.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 07.12.2006 17:29:51

alexpetri hat geschrieben:wozu brauche ich das "-p"
wer aus den man pages nicht so ganz schlau
ohne "-p" kann mkdir Verzeichnisse nur dann anlegen, wenn das darüberliegende Verzeichnis schon existiert. Nach dem diese Vorraussetzung aber in deinem Script nicht gewährleistet ist, brauchst du das "-p".


Gruß
gms

alexpetri
Beiträge: 49
Registriert: 30.01.2006 14:42:32

Beitrag von alexpetri » 10.12.2006 15:09:03

danke nochmal an alle...
eine frage hätte ich dann doch noch:
ich würde gerne alle Ordner die älter sind als heute zippen
gibt es da eine schnelle lösung das mit in das skript zu schreiben?
in etwa so dachte ich das:

Code: Alles auswählen

ZU_SICHERNDE_ORDNER=`date --date='1 day ago' +%F`
tar ???  $ZU_SICHERNDE_ORDNER".tar.gz"  $ZU_SICHERNDE_ORDNER*

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 10.12.2006 18:26:01

ungefähr so:

Code: Alles auswählen

ARCHIVE="$DST/$ZU_SICHERNDE_ORDNER.tar.gz"
if [ ! -f "$ARCHIVE" ] && ls -d $DST/$ZU_SICHERNDE_ORDNER\_??-?? &>/dev/null; then
  tar --remove-files -czvf "$ARCHIVE" $DST/$ZU_SICHERNDE_ORDNER\_??-??
fi
Gruß
gms

Antworten