Hromadné mazání pomocí rm v bash skriptu

Hromadné mazání pomocí rm v bash skriptu
« kdy: 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 ;)
« Poslední změna: 29. 11. 2018, 23:36:20 od doga312 »


Kit

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #1 kdy: 29. 11. 2018, 23:45:24 »
Co kdyby sis místo těchto experimentů rozchodil logrotate?

RDa

  • *****
  • 2 933
    • Zobrazit profil
    • E-mail
Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #2 kdy: 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.

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #3 kdy: 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 .....

kagro

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #4 kdy: 30. 11. 2018, 20:11:32 »
Ahoj,

skus sa inspirovat niecim takymto:

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



perceptron

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #5 kdy: 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

Test

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #6 kdy: 01. 12. 2018, 22:55:22 »
Netestovano
Kód: [Vybrat]
ls -1t “*.log” | tail -n +10 | xargs rm

karlik

Re:Hromadné mazání pomocí rm v bash skriptu
« Odpověď #7 kdy: 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