Fórum Root.cz
Hlavní témata => Software => Téma založeno: doga312 29. 11. 2018, 23:26:44
-
Ahoj,
nedaří se mi rozchodit bash skript.
Měl by smazat logy kromě deseti posledních ale vždy umaže jen jeden první.
if [ `ls /home/user/log/ -1 | wc -l` -gt 10 ]; then
rm -rf /home/user/log/`ls /home/user/log/ -1 | grep log | head -n -10`
fi
Dík za pomoc ;)
-
Co kdyby sis místo těchto experimentů rozchodil logrotate?
-
Kdyz delas skripty s potencialne nebezpecnyma prikazama, je dobre prikaz pred ostrym pouzitim jenom vypsat.
Tj dej pred rm echo a uvidis jaky jsi idiot - protoze to prvni log smaze z cesty, ale navic to smaze 9 souboru z aktualniho adresare ktere maji jmena jako ty logy.
Prakticke tipy:
ls -1 neni potreba kdyz je tam | (pipe), to se snad detekuje samo
rm -r neni potreba kdyz mazes jen soubory, nebo ti jde i o slozky?
rm -f neni bezne potreba (ty soubory nejsou readonly, ne?)
jestli je grep log na priponu, tak pouzij -Ee '[.]log$', nebo rovnou *.log v ls
Prakticky tam mas jeste jeden bug, ze pocitas soubory ktere jsou i mimo filtr s grep log - takze je mozne ze ti to smaze vsechny logy i kdyz tam bude jen 5 logu a 5 jinych souboru.
-
Kdyz delas skripty s potencialne nebezpecnyma prikazama, je dobre prikaz pred ostrym pouzitim jenom vypsat.
Tj dej pred rm echo a uvidis jaky jsi idiot - protoze to prvni log smaze z cesty, ale navic to smaze 9 souboru z aktualniho adresare ktere maji jmena jako ty logy.
Prakticke tipy:
ls -1 neni potreba kdyz je tam | (pipe), to se snad detekuje samo
rm -r neni potreba kdyz mazes jen soubory, nebo ti jde i o slozky?
rm -f neni bezne potreba (ty soubory nejsou readonly, ne?)
jestli je grep log na priponu, tak pouzij -Ee '[.]log$', nebo rovnou *.log v ls
Prakticky tam mas jeste jeden bug, ze pocitas soubory ktere jsou i mimo filtr s grep log - takze je mozne ze ti to smaze vsechny logy i kdyz tam bude jen 5 logu a 5 jinych souboru.
Super, takovou pomoc jsem potřeboval. Idiot děkuje .....
-
Ahoj,
skus sa inspirovat niecim takymto:
ls *.log | head -n -10 | xargs -d "\n" rm
-
neviete kolko logov mate ale musite nechat len 10
N=$(ls -1 *.log)
ls -t1r *.log | head -n $((N - 10)) | xargs -I{} rm {}
do N si zistite pocet vsetkych logov
ls -t sortuje podla casu modifikacie
-r reverzuje poradie
headom vyradite subory tak aby ostalo poslednych N okrem 10 ktore chcete nechat
xargs -I{} kazdy riadok posle ako parameter do rm
pozrite si shellcheck.net
-
Netestovano
ls -1t “*.log” | tail -n +10 | xargs rm
-
Pro inspiraci. :)
mylog="/var/local/backup/mariadb-backup/dump-mariadb/log"
exec 1>"${mylog}" 2>&1
# Turns on execution tracing (xtrace) which displays each command as it is executed.
set -o xtrace
# Causes the script to exit whenever there is an error.
set -o errexit
# Catch mysqldump fails in e.g. mysqldump | gzip.
# The exit status of the last command that threw a non-zero exit code is returned.
set -o pipefail
# Causes the shell to throw an error whenever an unset variable is used.
set -o nounset
# Archive path
archive_path="/var/local/backup/mariadb-backup/archives-mariadb"
# Archives older than this will be deleted
ARCHIVE_DAYS="30"
find "$archive_path" -maxdepth 1 -type f -name "*.log" -printf '%T@ %p\n' | sort -n | head -n -"$ARCHIVE_DAYS" | awk '{ print $2 }' | xargs -r rm