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
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!!
#####################################################################################
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
11 Kommentare
Neuester Kommentar
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
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
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:
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
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.....
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
Guten Abend,
versuch mal
zum Löschen. Ich verstehe nicht richtig, was Deine Codezeile machen soll.
Markus
versuch mal
find "$PLATTE1"/ -type d -ctime 21 -exec rm -rf '{}' \;
Markus
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
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
Du kannst doch mit
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
ls -lh
Markus