[Risolto] Ricerca file di Log

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
fabiopig
Prode Principiante
Messaggi: 16
Iscrizione: giovedì 29 luglio 2010, 13:07

[Risolto] Ricerca file di Log

Messaggio da fabiopig »

Ciao a tutti,
Sto cercando di risolvere un problema con una find.
In pratica devo costruire un comando che mi trovi tutti files di LOG, creati da una applicazione, tranne l'ultimo, per poi zipparli e trasferirli altrove.
Il problema è che l'ultimo file di log creato non necessariamente è stato creato il giorno precedente, vi faccio un esempio per farvi capire meglio.
Questa applicazione ad ogni avvio genera un file di log, ovviamente l'applicazione non viene avviata ogni giorno, pertanto ad oggi 05/08 ho 3 file di LOG:

log1 del 19-07
log2 del 23-07
log3 del 29-07

il mio intento è individuare log1 e log2 con una find e comprimerli con il comando -exec gzip {} +

ho trovato questo comando che mi da il risultato atteso:
find -exec stat -c '%Y %n' {} \; ! -name '*gz' | sort -nr | awk 'NR==2,NR==99 {print $2}'
ma il problema è che questa find non restituisce i files ma l'elenco testuale dei file corretti (nell'esempio log1 e log2) con non può essere passato a gxip per la compressione.

Avete qualche suggerimento?
Ultima modifica di fabiopig il martedì 31 agosto 2021, 16:00, modificato 1 volta in totale.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Ricerca file di Log

Messaggio da rai »

Prima di provare ad aiutarti nella direzione che chiedi, conosci logrotate?
DESCRIPTION
logrotate is designed to ease administration of systems that generate large numbers of log files. It allows automatic rotation, compression, removal, and mailing of log files. Each log file may
be handled daily, weekly, monthly, or when it grows too large.
Siccome è molto configurabile, è possibile che ti risolva il problema con meno fatica
fabiopig
Prode Principiante
Messaggi: 16
Iscrizione: giovedì 29 luglio 2010, 13:07

Re: Ricerca file di Log

Messaggio da fabiopig »

ciao la rotazione dei file di log viene già fatta direttamente dell'application, quindi i file ruotati ce li ho già.
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Ricerca file di Log

Messaggio da rai »

In pratica devo costruire un comando che mi trovi tutti files di LOG, creati da una applicazione, tranne l'ultimo
Per avere elencati tutti i file tranne l'ultimo non puoi semplicemente usare ls ed eliminare il più recente, per esempio con tail?

Codice: Seleziona tutto

$ ls /tmp/foo
'log1 del 19-07'  'log2 del 23-07'  'log3 del 29-07'

$ ls /tmp/foo/* -1t | tail -n+2
/tmp/foo/log2 del 23-07
/tmp/foo/log1 del 19-07

$ 
fabiopig
Prode Principiante
Messaggi: 16
Iscrizione: giovedì 29 luglio 2010, 13:07

Re: Ricerca file di Log

Messaggio da fabiopig »

in questa cartella ci sono n tipologie di log, nominati in modo diverso, quindi io dovrei filtrare per nome con il -name"nomefilelog*" escludere i file già zippati con ! -name '*gz' ed infine conservarmi solo il più recente
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2848
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Ricerca file di Log

Messaggio da rai »

Pausa pranzo, rieccomi.
Senza conoscere precisamente il pattern con cui vengono nominati questi file di log non si può essere molto precisi ma comunque il seguente codice potrebbe funzionare come esempio (avendo visto che fai uso di sort ho dato per scontato che il nomefile ha un qualche suffisso o prefisso che ne permette l'ordinamento lessicografico).

Codice: Seleziona tutto

$ ls -1 /tmp/foo/*
/tmp/foo/nomefilelog1.log
/tmp/foo/altro_logfile.log
/tmp/foo/filelog_diverso.log
/tmp/foo/nomefilelog1.gz
/tmp/foo/nomefilelog2.log
/tmp/foo/nomefilelog3.log
$ find /tmp/foo -regex ".*nomefilelog.*\.log" | sort -r | tail -n+2 | xargs -I {} echo "sto comprimendo in /tmp/foo/mioarchivio il file {}"
sto comprimendo in /tmp/foo/mioarchivio il file /tmp/foo/nomefilelog2.log
sto comprimendo in /tmp/foo/mioarchivio il file /tmp/foo/nomefilelog1.log
$ 
Per comodità, questo esempio assume arbitrariamente che il nome dei file sia fatto sul modello nomefilelogn.log con n numero progressivo. In questo modo mi disinteresso della data/ora di creazione dei file per identificare ed escludere il più recente.
Se le cose sono sostanzialmente divergenti da questa ipotesi, precisa bene nome ed estensione di questi log: potrebbe bastare fare un ritocco alla espressione regolare
Una volta fatti gli adattamenti al pattern di denominazione effettivo, se l'output ottenuto dovesse andare bene basterebbe sostituire al comando echo "..." il comando con cui effettui la compressione dei log
fabiopig
Prode Principiante
Messaggi: 16
Iscrizione: giovedì 29 luglio 2010, 13:07

Re: Ricerca file di Log

Messaggio da fabiopig »

Ciao,
scusami se sono scomparso, ma le ferie mi hanno assalito...:)
ho provato ad effettuare la find che mi hai consigliato ma senza successo...
i file hanno questo nome:
pippo.2021-07-19.log
pippo.2021-07-23.log
pippo.2021-07-26.log

poi ho:
pluto.2021-07-19.log
pluto.2021-07-23.log
pluto.2021-07-26.log

provando la find:
find /test/ -regex "pippo.20*\.log" | sort -r | tail -n+2

non ottengo nulla
in cosa sto sbagliando?
Avatar utente
gio1968
Prode Principiante
Messaggi: 42
Iscrizione: venerdì 1 maggio 2020, 22:52
Desktop: LXQt
Distribuzione: lubuntu 20.04.3 LTS
Sesso: Maschile

Re: Ricerca file di Log

Messaggio da gio1968 »

Stai usando -regex, quindi

Codice: Seleziona tutto

find /test -regex '.*pippo\.20.*\.log'
anche se sarebbe meglio, a meno che tu voglia proprio anche cercare nelle sottodirectory,

Codice: Seleziona tutto

find /test -maxdepth 1 -type f -regex '.*pippo\.20.*\.log'
. significa ogni carattere mentre, ovviamente, \. il punto

Come puoi vedere l'output non inizia con pippo:

Codice: Seleziona tutto

/test/pippo.2021-07-26.log
/test/pippo.2021-07-23.log
/test/pippo.2021-07-19.log
E' spiegato nel man di find, con un paio di esempi.

P.S. Quando scrivi per maggiore chiarezza dovresti usare i code.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Ricerca file di Log

Messaggio da UbuNuovo »

Altre due cose: la directory test è davvero in root, altrimenti devi impostare il percorso reale.
Visto che utilizzi i nomi di file con formato data anglosassone conviene usare sort -V con -r per il reverse; tipo:

Codice: Seleziona tutto

find /percorso/a/test -regex '.*pippo\.20.*\.log' | sort -Vr | tail -n+2
Salva l'Ucraina! 🇺🇦
fabiopig
Prode Principiante
Messaggi: 16
Iscrizione: giovedì 29 luglio 2010, 13:07

Re: Ricerca file di Log

Messaggio da fabiopig »

Vi ringrazio Ragazzi, siete stati davvero gentili ed esaudienti.
il comando finale che ho eseguito e che ha funzionato è stato:

find -regex "..pippo\.20.*\.log" | sort -r | tail -n+2 | xargs -I {} -exec gzip {}

Alla prossima!
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 11 ospiti