%20in%20allen%20Verzeichnissen%20mithilfe%20eines%20Bash-Skripts.png)
Ich suche nach einem Bash-Skript, das in eine Liste von Verzeichnissen geht und alle Dateien außer den vier zuletzt erstellten löscht.
Wie kann ich das machen?
Antwort1
ls -t | sed '1,4d' | xargs echo rm
Entfernen Sie es echo
, wenn Sie mit dem gewünschten Ergebnis zufrieden sind.
Wenn Ihre Dateinamen Leerzeichen enthalten, ist mehr Arbeit erforderlich.
Antwort2
Möchten Sie die vier aktuellsten Dateien in jedem Verzeichnis oder die vier aktuellsten Dateien in JEDEM Verzeichnis behalten?
Um das erste Problem zu lösen, würden Sie mit find alle Verzeichnisse auflisten und dann in jedem Verzeichnis alle Dateien außer den vier aktuellsten löschen. Das ist nicht allzu schwer.
Die Lösung des zweiten Problems erfordert etwas mehr Überlegung, ist aber tatsächlich einfacher zu schreiben.
Suchen Sie grundsätzlich rekursiv nach jeder Datei. Rufen Sie den Befehl „stat“ auf, der die Änderungszeit und den Namen der Datei zurückgibt. Sortieren Sie diese absteigend numerisch und überspringen Sie die ersten vier Dateien, da diese am aktuellsten sind.
Entfernen Sie dann die führenden Zeitstempel und die resultierende Liste der Dateinamen.
So etwas wie (ungetestet):
#!/bin/bash
find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
echo rm -v "${f}"
done
Dies sollte funktionieren, allerdings müssen Sie das „Echo“ in der While-Schleife entfernen, damit es wirksam wird. Testen Sie es vorher sorgfältig!
Antwort3
Mir ist klar, dass das nicht ganz das ist, was Sie fragen, aber für diese Art von Backup ziehe ich es vor, die Protokolldateien zu rotieren, bevor ich die neue erstelle. Es ist etwas expliziter und viel einfacher zu codieren, so:
#!/bin/bash
#Archive old backups
move () {
if [ -e $1 ]
then
echo "Archiving old backups: $1 to $2"
mv -f $1 $2 || echo "FAILED"
fi
}
#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz
#Now create today's backup
...
Antwort4
Die einfachste Methode:
for d in dir1 dir2 dir3; do
rm -vf `ls -1t $d | head -n-4`
done