Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Linux Shell Ordner zählen und löschen

Frage Linux

Mitglied: racer1601

racer1601 (Level 1) - Jetzt verbinden

13.03.2012, aktualisiert 22:58 Uhr, 3741 Aufrufe, 11 Kommentare

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

01.
#!/bin/bash 
02.
 
03.
# Sicherungsscript.sh 
04.
 
05.
##***************************************** 
06.
##***           BackupScript            *** 
07.
##***            00.03.2012             *** 
08.
##***       V.0.1Linux A. Schmidt       *** 
09.
##***************************************** 
10.
 
11.
DATE=`date +%Y.%m.%d` 
12.
TIME=`date +%H:%M` 
13.
#Variable DATE und TIME erstellen 
14.
 
15.
# mount /dev/BACKUP 
16.
# einhängen der Platte 
17.
 
18.
####################################################### 
19.
 
20.
LOG=/home/administrator/BackupLog.txt 
21.
zeilen_max=150 
22.
zeilen_gesamt=$(sed -n '$=' $LOG) 
23.
 
24.
 
25.
if [ $zeilen_gesamt -gt 150 ]; then 
26.
     let zeilen_loeschen=$zeilen_gesamt-$zeilen_max 
27.
     sed -i '' "1,${zeilen_loeschen}d" $LOG 
28.
 #else 
29.
     #exit 0 #####da muss noch was geändert werden 
30.
 fi 
31.
 
32.
##################################################### 
33.
 
34.
if [ -e UUIDPlatte1 ]; then 
35.
   	vorhanden=1 
36.
elif [ -e UUIDPlatte2 ]; then 
37.
   	vorhanden=2 
38.
elif [ -e UUIDPlatte3 ]; then 
39.
   	vorhanden=3 
40.
else 
41.
   	vorhanden=0 
42.
fi 
43.
##################################################### 
44.
 
45.
if [ $vorhanden -eq 1 ]; then 
46.
 
47.
 	eingehaengen=UUID=********* /media/backupplatte1   	 
48.
	 
49.
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup 
50.
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup 
51.
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup 
52.
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC 
53.
  	# erstellen der Verzeichnise 
54.
 
55.
elif [ $vorhanden -eq 2 ]; then 
56.
 	eingehaengen=UUID=********* /media/backupplatte2   	 
57.
	 
58.
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup 
59.
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup 
60.
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup 
61.
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC 
62.
  	# erstellen der Verzeichnise 
63.
 
64.
elif [ $vorhanden -eq 3 ]; then 
65.
 	eingehaengen=UUID=********* /media/backupplatte2   	 
66.
	 
67.
	vm=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"VMBackup 
68.
   	home=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"HomeBackup 
69.
   	austausch=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"AustauschBackup 
70.
	etc=mkdir $eingehaengen/BACKUP/BACKUP"$DATE"ETC 
71.
  	# erstellen der Verzeichnise	 
72.
 
73.
else 
74.
   	echo "######Verzeichnisse konnten nicht erstellt werden##$DATE##$TIME######" >> $Log 
75.
	umount $einhaengen 
76.
 
77.
	exit 0 
78.
fi 
79.
 
80.
# Abfrage ob Platte vorhanden und Verzeichnisse erstellen 
81.
 
82.
# Start des Scripts 
83.
 
84.
 
85.
echo "##########################################" >> $LOG 
86.
echo "##				      ##" >> $LOG 
87.
echo "##	Das Backup wird gestarte      ##" >> $LOG 
88.
echo "##		   am		      ##" >> $LOG 
89.
echo "##	    $DATE um $TIME	      ##" >> $LOG 
90.
echo "##				      ##" >> $LOG 
91.
echo "##				      ##" >> $LOG 
92.
echo "##########################################" >> $LOG 
93.
echo >> $LOG 
94.
echo >> $LOG 
95.
 
96.
 
97.
#rsync -av /quelle/ /ziel/ 
98.
 
99.
 
100.
rsync -av /home/AUSTAUSCH/* -R $austausch 
101.
#cp /home/AUSTAUSCH/* -R $einhaengen/"$DATE"AustauschBackup 
102.
echo "" >> $LOG 
103.
####AUSTAUSCHVERZEICHNIS-Kopiert##$DATE##$TIME#### >> $LOG 
104.
 
105.
rsync -av /home/$USER/* -R $home 
106.
#cp /home/$USER/* -R $einhaengen/"$DATE"HomeBackup 
107.
echo "" >> $LOG 
108.
####USERVERZEICHNISE-Kopiert##$DATE##$TIME#### >> $LOG 
109.
 
110.
#rsync -av /PFAD-VM/* -R $vm 
111.
cp -a /PFAD-VM/* -R $vm 
112.
echo >> $LOG 
113.
####VMJoomlaServer-Kopiert##$DATE##$TIME#### >> $LOG 
114.
 
115.
umount $einhaengen 
116.
 
117.
exit 0 
118.
 
119.
 
120.
#########################Erklärungen Wichtig!!!!#################################### 
121.
 
122.
###################Erklärung Automatisches Platteneinhängen######################### 
123.
 
124.
# USB HDD Backupplatten einhaengen 
125.
# Regeln liegen unter /lib/udev/rules.d/ 
126.
# infos unter http://wiki.ubuntuusers.de/udev 
127.
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte1", SYMLINK+="BACKUP" 
128.
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte2", SYMLINK+="BACKUP" 
129.
# BUS=="usb", KERNEL=="sd?1", SYSFS{serial}=="SeriennummerPlatte3", SYMLINK+="BACKUP" 
130.
 
131.
###################Erklärung Zeitgesteuerte Aufgabe ########################## 
132.
 
133.
 
134.
# /etc/crontab 
135.
#   
136.
# 30 22 * * 1-5 root Sicherungsscript.sh 
137.
 
138.
##################################################################################### 
139.
 
140.
# Datei /home/administrator/BackupLog.txt erstellen!! 
141.
 
142.
#####################################################################################
Mitglied: hmarkus
13.03.2012 um 22:27 Uhr
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
Bitte warten ..
Mitglied: racer1601
13.03.2012 um 22:42 Uhr
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
Bitte warten ..
Mitglied: hmarkus
14.03.2012 um 13:45 Uhr
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
Bitte warten ..
Mitglied: racer1601
21.03.2012 um 23:36 Uhr
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
Bitte warten ..
Mitglied: racer1601
24.03.2012 um 21:24 Uhr
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:
01.
#!/bin/bash -x 
02.
# Sicherungsscript.sh 
03.
#*****************************************# 
04.
#***           BackupScript            ***# 
05.
#***            00.03.2012             ***# 
06.
#***       V.0.1Linux A. Schmidt       ***# 
07.
#*****************************************# 
08.
DATE=$(date +%Y.%m.%d) 
09.
TIME=$(date +%H:%M) 
10.
#Variable DATE und TIME erstellen 
11.
####################################################### 
12.
LOG=/home/administrator/BachupLog1.txt 
13.
zeilen_max=150 
14.
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.

01.
if [ $zeilen_gesamt -gt 150 ]; 
02.
    then 
03.
         echo "#################hinter if###############" >> $LOG 
04.
         let zeilen_loeschen=$zeilen_gesamt-$zeilen_max 
05.
         sed -i "1,${zeilen_loeschen}d" $LOG 
06.
         echo "#############Prüfung der Länge wurde durchgeführt############ >> $LOG 
07.
fi 
08.
##################################################### 
09.
PLATTE1=/media/TESTSTICK 
10.
  
11.
if [ -e "$PLATTE1" ]; 
12.
    then 
13.
echo "#############Backup Platte1 ist angeschlossen############" >> $LOG 
14.
    find "$PLATTE1"/* -type d -ctime 21 -exec rm -rf "$PLATTE1"/BACKUP"$DATE" / \; 
15.
 
Hier werden die Ordner eingelesen aber leider nicht gelöscht
01.
        ORDNER="$PLATTE1"/BACKUP"$DATE" 
02.
        VM="$ORDNER"/VMBackup 
03.
        HOME="$ORDNER"/HomeBackup 
04.
        AUSTAUSCH="$ORDNER"/AustauschBackup 
05.
        ETC="$ORDNER"/ETCBackup 
06.
        LIB="$ORDNER"/LIBBackup 
07.
        `mkdir $ORDNER/` 
08.
        `mkdir $VM/` 
09.
        `mkdir $HOME/` 
10.
        `mkdir $AUSTAUSCH/` 
11.
        `mkdir $ETC/` 
12.
        `mkdir $LIB/` 
13.
echo "#############Verzeichnisse auf Platte1 erstellt "$TIME"############" >> $LOG 
14.
else 
15.
    vorhanden=0 
16.
fi
Bitte warten ..
Mitglied: hmarkus
24.03.2012 um 22:05 Uhr
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
Bitte warten ..
Mitglied: racer1601
25.03.2012 um 00:03 Uhr
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.
Bitte warten ..
Mitglied: hmarkus
25.03.2012 um 10:29 Uhr
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
Bitte warten ..
Mitglied: racer1601
25.03.2012 um 13:26 Uhr
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
Bitte warten ..
Mitglied: racer1601
25.03.2012 um 13:31 Uhr
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
Bitte warten ..
Mitglied: hmarkus
25.03.2012 um 19:09 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(5)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
14 Tage alte Dateien automatisch löschen - Shell (1)

Frage von traller zum Thema Batch & Shell ...

Windows 10
Löschen von Ordner mit Dateien (3)

Frage von jerry32 zum Thema Windows 10 ...

Batch & Shell
gelöst Per FTP-Shell oder Batch in ein unbekanten Ordner wechseln (8)

Frage von Ducky2 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...