Fórum Root.cz

Hlavní témata => Software => Téma založeno: doga312 29. 11. 2018, 23:26:44

Název: Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: 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í.
Kód: [Vybrat]
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 ;)
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: Kit 29. 11. 2018, 23:45:24
Co kdyby sis místo těchto experimentů rozchodil logrotate?
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: RDa 29. 11. 2018, 23:48:17
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.
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: doga312 30. 11. 2018, 08:39:21
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 .....
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: kagro 30. 11. 2018, 20:11:32
Ahoj,

skus sa inspirovat niecim takymto:

ls *.log | head -n -10 | xargs -d "\n" rm

Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: perceptron 01. 12. 2018, 14:43:43
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
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: Test 01. 12. 2018, 22:55:22
Netestovano
Kód: [Vybrat]
ls -1t “*.log” | tail -n +10 | xargs rm
Název: Re:Hromadné mazání pomocí rm v bash skriptu
Přispěvatel: karlik 02. 12. 2018, 14:23:20
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