Come ordinare i files in base alla data di creazione, ultima modifica o accesso, in Linux. I comandi ls, find, sort.
In questo articolo vediamo come individuare, nel nostro filesystem Linux, uno o più files, creati o modificati in una particolare data o orario, e di come ordinare il risutato della nostra ricerca, utilizzando delle istruzioni da linea di comando.
Utilizzeremo per i nostri esempi 3 comandi: ls, sort e find
Ordinare i files in base alla data di creazione o modifica
A questo scopo utilizziamo il comando "ls", abbreviazione di "list", seguito dalle seguenti opzioni:
- l: serve a visualizzare varie informazioni dei files tra cui i premessi, il propriteario, il gruppo, il peso del file e la data
- t: serve ad ordinare la lista per data, in modalità decrescente, quindi in testa andrà la data più recente
ls -lt
Il risultato sarà
-rw-r--r-- 1 apache apache 360 17 feb 23.35 2020-02-17.txt
-rw-r--r-- 1 apache apache 495 18 feb 10.35 2020-02-18.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-cartdeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-code.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-deltmpfam.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-deltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-orddeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 01.35 check-statsday.txt
-rw-r--r-- 1 apache apache 10 18 feb 01.35 check-statsieri.txt
Volendo ribaltare l'ordinamento aggiungiamo l'opzione "r" (reverse)
ls -ltr
Ecco il risultato: i file più vecchi verranno mostrati per primi
-rw-r--r-- 1 apache apache 360 17 feb 23.35 2020-02-17.txt
-rw-r--r-- 1 apache apache 10 18 feb 01.35 check-statsieri.txt
-rw-r--r-- 1 apache apache 10 18 feb 01.35 check-statsday.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-code.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-orddeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-deltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-cartdeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 05.35 check-deltmpfam.txt
-rw-r--r-- 1 apache apache 495 18 feb 10.35 2020-02-18.txt
Se vogliamo estendere il concetto di ultima modifica, anche a modifiche relative ad informazioni di stato quali proprietario, gruppo, autorizzazioni, dimensioni, ... dobbiamo utilizzare l'opzione "c", abbreviazione di "ctime".
ls -ltc
Ecco il risutlato
-rw-r--r-- 1 apache apache 540 18 feb 11.35 2020-02-18.txt
-rw-r--r-- 1 apache apache 360 18 feb 11.35 2020-02-17.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-cartdeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-code.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-deltmpfam.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-deltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-orddeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-statsday.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-statsieri.txt
Ordinare i files in base alla data di ultimo accesso
Per visualizzare la lista dei files ordinate per data di ultimo accesso, utilizziamo l'opzione "u", abbreviazione di "use".
ls -ltu
Il risulato sarà
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-cartdeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-code.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-deltmpfam.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-deltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-orddeltmp.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-statsday.txt
-rw-r--r-- 1 apache apache 10 18 feb 11.35 check-statsieri.txt
-rw-r--r-- 1 apache apache 540 18 feb 00.35 2020-02-18.txt
-rw-r--r-- 1 apache apache 360 17 feb 16.35 2020-02-17.txt
Ordinare il risultato di "ls -l" per data
Introduciamo adesso il comando "sort" ("ordina") da applicare al risultato di "ls -l"
Prima di tutto, rivediamo il risultato di un semplice ls -l (mi limito ad una parte di estrazione)
drwxr-xr-x. 2 root root 176 24 lug 2019 anaconda
drwx------. 2 root root 99 18 feb 08.11 audit
-rw-------. 1 root root 0 25 lug 2019 boot.log
-rw------- 1 root root 35041 25 lug 2019 boot.log-20190725
-rw------- 1 root utmp 141094656 18 feb 13.20 btmp
-rw------- 1 root utmp 178138368 1 feb 04.59 btmp-20200201
drwxr-xr-x. 2 chrony chrony 6 12 apr 2018 chrony
-rw------- 1 root root 3886 18 feb 13.20 cron
-rw------- 1 root root 19775 15 feb 08.16 cron-20200215
-rw------- 1 root root 13969 16 feb 04.32 cron-20200216
-rw------- 1 root root 20521 17 feb 09.18 cron-20200217
-rw------- 1 root root 16062 18 feb 07.49 cron-20200218
-rw-r--r-- 1 root root 37519 24 lug 2019 dmesg
-rw-r--r-- 1 root root 37417 24 lug 2019 dmesg.old
.............
Il risultato, come possiamo vedere, è disposto su più colonne, esattamente 9 colonne.
Vogliamo ordinare in base per data, utilizzando il comando sort con alcune opzioni
ls -l | sort -k7M -k6n
k7: k serve ad identificare la chiave di ordinamento, cioè su quale delle nostre colonne applicare l'ordinamento. Abbiamo scelto la settima colonna quindi k7, cioè la colonna del mese
M: identifica il metodo di ordinamento della settima colonna, per mese.
Poi riordiniamo per
k6: mi baso sulla sesta colonna, cioè la colonna relativa giorno
n: ordino numericamente la sesta colonna
Ecco il risultato (mi limito ad una parte di estrazione)
-rw------- 1 root root 0 1 gen 08.09 yum.log
-rw------- 1 root utmp 178138368 1 feb 04.59 btmp-20200201
-rw------- 1 root root 0 14 feb 04.47 spooler-20200215
-rw------- 1 root root 0 15 feb 08.16 spooler-20200216
-rw------- 1 root root 19775 15 feb 08.16 cron-20200215
-rw------- 1 root root 23558 15 feb 08.16 messages-20200215
-rw------- 1 root root 26852 15 feb 07.40 maillog-20200215
-rw------- 1 root root 78336829 15 feb 08.16 fail2ban.log-20200215
-rw------- 1 root root 8327458 15 feb 08.16 secure-20200215
-rw------- 1 root root 0 16 feb 04.32 spooler-20200217
-rw------- 1 root root 12886 16 feb 04.32 messages-20200216
..................
Abbiamo introdotto il comando sort, che a breve riprenderemo.
Adesso vediamo come utilizzare il comando find per le nostre ricerche.
Ordinare i files per mese
In questo esempio, vogliamo ordinare tutti i files presenti nella cartella "/var/log"
find /var/log -type f -printf "\n%Ab %p" | head -n 10
Vediamo nel dettaglio il suo significato
find /var/log: cerca nella cartella /var/log
-type f: cerco solo dei files
-printf "\n%Ab %p": voglio visualizzare una lista, con un file per riga (\n) che visualizzi il mese (%Ab) e il nome del file (%p)
head -n 10: voglio vedere solo 10 files
Il risultato sarà il seguente
Dec /usr/lib/nvidia/pre-install
Dec /usr/lib/libcpufreq.so.0.0.0
Apr /usr/lib/libchromeXvMCPro.so.1.0.0
Apr /usr/lib/libt1.so.5.1.2
Apr /usr/lib/libchromeXvMC.so.1.0.0
Apr /usr/lib/libcdr-0.0.so.0.0.15
Dec /usr/lib/msttcorefonts/update-ms-fonts
Nov /usr/lib/ldscripts/elf32_x86_64.xr
Nov /usr/lib/ldscripts/elf_i386.xbn
Nov /usr/lib/ldscripts/i386linux.xn
Abbiamo ottenuto una lista, divisa su due colonne: la prima con il mese, la seconda con il nome del file
Se adesso vogliamo ordinare il risultato ottenuto per mese, utilizziamo il comando sort in questo modo
find /var/log -type f -printf "\n%Ab %p" | head -n 10 | sort -k 1M
k: k serve ad identificare la chiave di ordinamento, cioè su quale delle due colonne ottenute precedentemente applicare l'ordinamento.
1: abbiamo scelto la prima colonna, quella che presenta il mese
M: identifica il metodo di ordinamento della prima colonna, per mese.
Potremmo anche scrivere k1M tutto assieme.
Ecco il risultato
feb /var/log/audit/audit.log.1
feb /var/log/audit/audit.log.2
feb /var/log/audit/audit.log.3
feb /var/log/audit/audit.log.4
feb /var/log/lastlog
lug /var/log/grubby_prune_debug
lug /var/log/tallylog
lug /var/log/tuned/tuned.log
lug /var/log/wtmp
Ordinare i files per data di ultimo accesso
Riprendiamo l'esempio precedente e modifichiamolo come segue
find /var/log -type f -printf "\n%AD %AT %p" | head -n 10
La lista che adesso vogliamo ottenere deve visualizzare la data di ultimo accesso "%AD", l'orario di ultimo accesso "%AT" e il nome del file "%p".
Ecco il risultato (la data visualizzata nella prima colonna rappresenta il mese, il giorno e l'anno)
07/24/19 12:39:32.5745365390 /var/log/tallylog
07/24/19 12:39:39.1628274950 /var/log/grubby_prune_debug
02/18/20 11:23:35.4275652480 /var/log/lastlog
07/24/19 12:39:50.3403211220 /var/log/wtmp
07/24/19 12:46:37.9350649710 /var/log/tuned/tuned.log
02/17/20 06:44:51.9133584380 /var/log/audit/audit.log.4
02/17/20 12:17:01.3952619590 /var/log/audit/audit.log.3
02/17/20 19:05:25.6964568940 /var/log/audit/audit.log.2
02/18/20 03:27:38.4339185610 /var/log/audit/audit.log.1
Ordiniamo questo risultato applicando l'ordinamento sulla prima colonna
find /var/log -type f -printf "\n%AD %AT %p" | head -n 10 | sort -k 1.7nr -k 1.1,2nr - k 1.4,5nr
In questo caso abbiamo utilizzato più ordinamenti successivi:
k 1.7nr: ordina per la prima colonna (k1), considerandola dal settimo carattere (7) alla fine della colonna, cioè l'anno, ed applico un ordinamento numerico (n), inverso (r) cioè dall'anno più recente al più vecchio
k 1.1,2nr: ordina per la prima colonna (k1), considerandola dal primo al secondo carattere (1,2), cioè il mese, è un ordinamento numerico (n), in ordine inverso (r) quindi dal mese più recente al più vecchio
k 1.4,5nr: infine ordina il tutto per la prima colonna (k1), considerando solo dal quarto al quinto carattere (4,5), cioè il giorno, è un ordinamento numerico (n), in ordine inverso (r) cioè dal giorno più recente al più vecchio.
Ecco il risultato
02/18/20 03:27:38.4339185610 /var/log/audit/audit.log.2
02/18/20 08:11:13.7399532650 /var/log/audit/audit.log.1
02/18/20 11:23:35.4275652480 /var/log/lastlog
02/17/20 12:17:01.3952619590 /var/log/audit/audit.log.4
02/17/20 19:05:25.6964568940 /var/log/audit/audit.log.3
07/24/19 12:39:32.5745365390 /var/log/tallylog
07/24/19 12:39:39.1628274950 /var/log/grubby_prune_debug
07/24/19 12:39:50.3403211220 /var/log/wtmp
07/24/19 12:46:37.9350649710 /var/log/tuned/tuned.log
Ordinare i files per orario
Modifichiamo il nostro esempio così
find /var/log -type f -printf "\n%AT %p" | head -n 10
La lista che vogliamo ottenere deve visualizzare solo l'orario di ultimo accesso "%AT" e il nome del file "%p".
A questa lista applichiamo, ad esempio, l'ordinamento numerico basato sulla prima cifra dell'orario
find /var/log -type f -printf "\n%AT %p" | head -n 10 | sort -k1.1n
Il risultato:
03:27:38.4339185610 /var/log/audit/audit.log.1
06:44:51.9133584380 /var/log/audit/audit.log.4
11:23:35.4275652480 /var/log/lastlog
12:17:01.3952619590 /var/log/audit/audit.log.3
12:39:32.5745365390 /var/log/tallylog
12:39:39.1628274950 /var/log/grubby_prune_debug
12:39:50.3403211220 /var/log/wtmp
12:46:37.9350649710 /var/log/tuned/tuned.log
19:05:25.6964568940 /var/log/audit/audit.log.2
Abbiamo visto una panoramica relativa all'utilizzo di ordinamento dei files con alcuni esempi, che ovviamente potete e dovete sviluppare secondo le vostre necessità.
Buon lavoro!