racer1601
Goto Top

Linux Shell Ordner zählen und löschen

Hallo und Guten Abend
Ich habe mir eine shell geschrieben für die Datensicherung an einem Server.

Achso vorne weg ich arbeite zum erstenmal mit Linux!

Also bisher ist die Shell so aufgebaut das wenn eines von drei Geräten angeschlossen wird, erstellt die Shell ein neues Verzeichnis mit:
mkdir $eingehangen/BACKUP/"$DATE"VMBackup
und noch vier weitere Unterverzeichnise unter: $eingehangen/BACKUP. Danach wird dann die Sicherung in diese Verzeichnisse durchgeführt.
Aber jetzt kommt mein Problem:
Da die Platten ja nur eine bestimmte Grösse haben, muss ich die Anzahl der Hauptordner "BACKUP" auf sechs begrenzen. Nur habe ich keinen schimmer wie ich das in einer Shell anstellen kann.
Habe schon mal mit "find" rumprobiert aber damit komme ich nicht wirklich weiter. Ich dachte schonmal an eine Variable die pro Platte hochgezählt wird. Die könnte man dann "$variable"BACKUP vorlagern und auswerten.
Und wenn die dann > 6 ist soll wieder bei 1 angefangen werden. Also erst soll natürlich die alte Sicherung mit der 1 gelöscht werden und danach mit der neuen Sicherung wieder erstellt werden.
Die 8. würde dann die 2. löschen und wieder neu erstellen.
Aber ich habe keinen Plan wie ich das realisieren kann. Kann mir jemand helfen?

Gruß Alex

#!/bin/bash

# Sicherungsscript.sh

##*****************************************
##***           BackupScript            ***
##***            00.03.2012             ***
##***       V.0.1Linux A. Schmidt       ***
##*****************************************

DATE=`date +%Y.%m.%d`
TIME=`date +%H:%M`
#Variable DATE und TIME erstellen

# mount /dev/BACKUP
# einhängen der Platte

#######################################################

LOG=/home/administrator/BackupLog.txt
zeilen_max=150
zeilen_gesamt=$(sed -n '$=' $LOG)  


if [ $zeilen_gesamt -gt 150 ]; then
     let zeilen_loeschen=$zeilen_gesamt-$zeilen_max
     sed -i '' "1,${zeilen_loeschen}d" $LOG  
 #else
     #exit 0 #####da muss noch was geändert werden
 fi

#####################################################

if [ -e UUIDPlatte1 ]; then
   	vorhanden=1
elif [ -e UUIDPlatte2 ]; then
   	vorhanden=2
elif [ -e UUIDPlatte3 ]; then
   	vorhanden=3
else
   	vorhanden=0
fi
#####################################################

if [ $vorhanden -eq 1 ]; then

 	eingehaengen=UUID=********* /media/backupplatte1   	
	
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup  
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup  
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup  
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC  
  	# erstellen der Verzeichnise

elif [ $vorhanden -eq 2 ]; then
 	eingehaengen=UUID=********* /media/backupplatte2   	
	
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup  
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup  
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup  
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC  
  	# erstellen der Verzeichnise

elif [ $vorhanden -eq 3 ]; then
 	eingehaengen=UUID=********* /media/backupplatte2   	
	
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup  
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup  
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup  
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC  
  	# erstellen der Verzeichnise	

else
   	echo "######Verzeichnisse konnten nicht erstellt werden##$DATE##$TIME######" >> $Log  
	umount $einhaengen

	exit 0
fi

# Abfrage ob Platte vorhanden und Verzeichnisse erstellen

# Start des Scripts


echo "##########################################" >> $LOG  
echo "##				      ##" >> $LOG  
echo "##	Das Backup wird gestarte      ##" >> $LOG  
echo "##		   am		      ##" >> $LOG  
echo "##	    $DATE um $TIME	      ##" >> $LOG  
echo "##				      ##" >> $LOG  
echo "##				      ##" >> $LOG  
echo "##########################################" >> $LOG  
echo >> $LOG
echo >> $LOG


#rsync -av /quelle/ /ziel/


rsync -av /home/AUSTAUSCH/* -R $austausch
#cp /home/AUSTAUSCH/* -R $einhaengen/"$DATE"AustauschBackup 
echo "" >> $LOG  
####AUSTAUSCHVERZEICHNIS-Kopiert##$DATE##$TIME#### >> $LOG

rsync -av /home/$USER/* -R $home
#cp /home/$USER/* -R $einhaengen/"$DATE"HomeBackup 
echo "" >> $LOG  
####USERVERZEICHNISE-Kopiert##$DATE##$TIME#### >> $LOG

#rsync -av /PFAD-VM/* -R $vm
cp -a /PFAD-VM/* -R $vm
echo >> $LOG
####VMJoomlaServer-Kopiert##$DATE##$TIME#### >> $LOG

umount $einhaengen

exit 0


#########################Erklärungen Wichtig!!!!####################################

###################Erklärung Automatisches Platteneinhängen#########################

# USB HDD Backupplatten einhaengen
# Regeln liegen unter /lib/udev/rules.d/
# infos unter http://wiki.ubuntuusers.de/udev
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte1", SYMLINK+="BACKUP" 
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte2", SYMLINK+="BACKUP" 
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte3", SYMLINK+="BACKUP" 

###################Erklärung Zeitgesteuerte Aufgabe ##########################


# /etc/crontab
#  
# 30 22 * * 1-5 root Sicherungsscript.sh

#####################################################################################

# Datei /home/administrator/BackupLog.txt erstellen!!

#####################################################################################

Content-ID: 181908

Url: https://administrator.de/forum/linux-shell-ordner-zaehlen-und-loeschen-181908.html

Ausgedruckt am: 22.12.2024 um 22:12 Uhr

64748
64748 13.03.2012 um 22:27:58 Uhr
Goto Top
Guten Abend Alex,

wenn es sich um einen Server handelt und dieser in einer Produktivumgebung steht, wie kommt es dann, dass Du ohne Ahnung daran herumfummeln kannst? Du solltest denjenigen fragen, der den Server eingerichtet hat.

Anderenfalls solltest Du mal das Shellskript posten welches die von Dir oben beschriebenen Dinge ausführt.

Markus
racer1601
racer1601 13.03.2012 um 22:42:52 Uhr
Goto Top
der Server ist noch nicht im Productivbetrieb! er ist also um erfahrungen zusammeln. das skript ist noch nicht fertig oder gar getestet. Bastel noch daran rum. aber ich poste es mal. Aber nicht lachen ist ein erster entwurf face-wink
64748
64748 14.03.2012 um 13:45:30 Uhr
Goto Top
Hallo Alex,

leider bin ich kein großer Experte mit der Shell, ich mache solche Sachen immer mit Perl. Aber ich finde es sehr gut, dass Du Dich als Einsteiger an solch ein Skript heranwagst, dabei lernst Du vieles, was Dir im Linux-Umfeld immer wieder begegnen wird

Heute habe ich mal über Deine Problemstellung nachgedacht. Ich würde an Deiner Stelle nicht die Ordner zählen, sondern falls erforderlich die ältesten löschen. Anstatt vier Verzeichnisse jeweils mit dem Sicherungsdatum zu erstellen, würde ich diese vier Ordner in einem Ordner mit dem Sicherungsdatum erstellen, also etwas so:
/Backup/BKP_14_03_2012/Home_14_12_2012/
/Backup/BKP_14_03_2012/ETC_14_12_2012/
                          ....usw.....
dann kannst Du falls erforderlich jeweils das älteste Verzeichnis löschen. Du kannst beispielsweise das Sicherungsdatum aus dem Verzeichnisnamen auslesen oder (was einfacher ist) die Ausgabe von "ls -l" parsen, bzw die Ausgabe von ls so sortieren lassen, dass das älteste Verzeichnis als erstes angezeigt wird und dieses Verzeichnis dann löschen (natürlich mit vorheriger Nachfrage).
Dazu kann ich mir vorstellen, dass Du die zu sichernden Verzeichnisse erst mit "du -h" auf ihre Größe untersuchst, diese Größe mit dem Platz auf der Platte vergleichst und dann löschst.

Gruß

Markus
racer1601
racer1601 21.03.2012 um 23:36:00 Uhr
Goto Top
Hallo

Sorry für die späte Meldung war ein paar Tage krank. Habe heute mal angefangen das Skript zu testen und direkt einige Syntax Fehler behoben.
Ich habe jetzt einiges geändert, so das ich mit einem" find "direkt die Verzeichnisse mit einem bestimmten Alter löschen kann.

werde aber erst Montag wieder daran weiter machen können.

Gruß Alex
racer1601
racer1601 24.03.2012 um 21:24:50 Uhr
Goto Top
so sorry für die späte Meldungen. Ich bin schon was weiter. aber es hagt immer noch vieleicht kann mir ja jemand eine Lösung sagen.

Also ich habe noch 2 Probleme
1.) Die länge des LOGFiles wird noch eingelesen aber dann bricht er ab. Also das ganze skript wird abgebrochen.(ich mackiere mal die Stelle)

2.) Das find komando wird ausgeführt aber die Ordner die älter als 21 Tage sind werden nicht gelöscht.

Hier mal eine test shell:
#!/bin/bash -x
# Sicherungsscript.sh
#*****************************************#
#***           BackupScript            ***#
#***            00.03.2012             ***#
#***       V.0.1Linux A. Schmidt       ***#
#*****************************************#
DATE=$(date +%Y.%m.%d)
TIME=$(date +%H:%M)
#Variable DATE und TIME erstellen
#######################################################
LOG=/home/administrator/BachupLog1.txt
zeilen_max=150
zeilen_gesamt=$(sed -n '$=' $LOG)  


bis hier kommt die shell wenn ich es laufen lasse dann kommt fehler in Zeile 97 und er hat dann auch nichts getan.

if [ $zeilen_gesamt -gt 150 ];
    then
         echo "#################hinter if###############" >> $LOG  
         let zeilen_loeschen=$zeilen_gesamt-$zeilen_max
         sed -i "1,${zeilen_loeschen}d" $LOG  
         echo "#############Prüfung der Länge wurde durchgeführt############ >> $LOG  
fi
#####################################################
PLATTE1=/media/TESTSTICK
 
if [ -e "$PLATTE1" ];  
    then
echo "#############Backup Platte1 ist angeschlossen############" >> $LOG  
    find "$PLATTE1"/* -type d -ctime 21 -exec rm -rf "$PLATTE1"/BACKUP"$DATE" / \;  
Hier werden die Ordner eingelesen aber leider nicht gelöscht
        ORDNER="$PLATTE1"/BACKUP"$DATE"  
        VM="$ORDNER"/VMBackup  
        HOME="$ORDNER"/HomeBackup  
        AUSTAUSCH="$ORDNER"/AustauschBackup  
        ETC="$ORDNER"/ETCBackup  
        LIB="$ORDNER"/LIBBackup  
        `mkdir $ORDNER/`
        `mkdir $VM/`
        `mkdir $HOME/`
        `mkdir $AUSTAUSCH/`
        `mkdir $ETC/`
        `mkdir $LIB/`
echo "#############Verzeichnisse auf Platte1 erstellt "$TIME"############" >> $LOG  
else
    vorhanden=0
fi
64748
64748 24.03.2012 um 22:05:27 Uhr
Goto Top
Guten Abend,

versuch mal
find "$PLATTE1"/ -type d -ctime 21 -exec rm -rf '{}' \; 
zum Löschen. Ich verstehe nicht richtig, was Deine Codezeile machen soll.

Markus
racer1601
racer1601 25.03.2012 um 00:03:11 Uhr
Goto Top
da war ein Tipp fehler in der Zeile:

find "$PLATTE1"/* -type d -ctime 21 -exec rm -rf "$PLATTE1/BACKUP"$DATE" / \;

so ist es richtig. Also auf der Platte sollen alle Ordner die älter als 21 Tage sind gelöscht werden. Wenn die Zeile durchläuft (auf der Komandozeile mit -x) listet er auch brav alle Ordner auf, die er findet, aber er löscht sie halt nicht.
In der Variable DATE steht immer das aktuelle Datum.
64748
64748 25.03.2012 um 10:29:59 Uhr
Goto Top
Guten Morgen,

m.E. vergisst Du der -exec Option die gefundenen Dateien zu übermitteln. Das macht z.B. der Code den ich oben gepostet habe.

Ich bin selbst kein Experte für find, aber lies Dir mal hier http://doc-tcpip.org/Unix/find-cmd.html die Beispiele durch.

Also ich fasse nochmal zusammen, damit ich nichts falsch verstanden habe: Du suchst mit find nach Verzeichnissen (-type d) welche älter sind als 21 Tage (-ctime 21) und möchtest die gefundenen Verzeichnisse mit -exec an das rm Kommando weiter geben. Der Platzhalter {} enthält die von find gefundenen Verzeichnisse, aber die von Dir angegebenen Variablen "$PLATTE1/BACKUP/$DATE" hat ja nix zu tun mit der Ausgabe von find. Außerdem ist dort bei Dir etwas mit den Anführungszeichen durcheinandergeraten. Hier KUP"$DA ist ein Anführungszeichen zuviel. Allerdings würde Dir dieses Kommando doch die Backups von heute löschen???

Markus
racer1601
racer1601 25.03.2012 um 13:26:28 Uhr
Goto Top
So langsam fange ich an an mir zu zweifeln.

Irgendwie klappt es nicht, hier mal Bilder was ich mache:

hier das Bild vom nano:

[img]http://foto.arcor-online.net/palb/alben/24/5473724/3631356661323737.jpg[/img]

mann kann auch sehen wie die Ordner angelegt werden. Kann es sein das er nicht sieht wann die Ordner erstellt wurden?Oder besser gefragt sieht er das Datum wann die Ordner wirklich angelegt wurden? Dann kann es nähmlich nicht gehen da die alle von gestern sind. Muss gleich mal testen mit der Angabe für einen Tag. Und wenn das so ist kann man dieses wirkliche erstellungs Datum für Testzwecke manipulieren?

hier das was auf der Komandozeile passiert wenn die Shell durchläuft:

[img]http://foto.arcor-online.net/palb/alben/24/5473724/3836373061333237.jpg[/img]

Gruß Alex
racer1601
racer1601 25.03.2012 um 13:31:25 Uhr
Goto Top
Also es ist so wie gerade vermutet hatte! Jetzt muss ich rausbekommen wie man das wirkliche Erstellungsdatum manipulieren kann.

Er hat gerade als ich -ctime 21 auf -ctime 1 geändert habe alle Ordner gelöscht die älter als ein Tag waren!

Gruß Alex
64748
64748 25.03.2012 um 19:09:58 Uhr
Goto Top
Du kannst doch mit
ls -lh
sehen, welches Datum die Verzeichnisse haben. ctime orientiert sich an dem Datum, an dem die Datei zuletzt geändert wurde. Das setzt natürlich voraus, dass die Verzeichnisse tatsächlich mindestens drei Wochen alt sind und seither nicht verändert wurden.

Markus