POSIX ha questo da dire sulle date in un ls
-l
elenco ong:
Il <date and time>
campo deve contenere la data e il timestamp appropriati dell'ultima modifica del file. Nelle impostazioni internazionali POSIX, il campo deve essere equivalente all'output del comando date seguente:
date "+%b %e %H:%M"
... se il file è stato modificato negli ultimi sei mesi o:
date "+%b %e %Y"
Tenendo conto di ciò e assicurando che se ci sono nuove righe in un nome file sono adeguatamente disturbate dall'opzione POSIX specificata ls -q
, è relativamente facile preparare una regex per un ls
risultato senza find
affatto:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
per questo e restituirai solo le righe che contengono le stringhe che rappresentano le date di oggi o di ieri. Il seguente comando aggiunge un po 'a quello:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
le opzioni sono costituite da:
-a
restituisce tutti i file in una directory, inclusi quelli che iniziano con a .dot
-l
lista lunga
-R
elenca ricorsivamente tutte le directory secondarie
-c
visualizzare il tempo di modifica anziché il tempo di accesso
-q
restituisce la shell glob ?
anziché caratteri non stampabili o \t
ab in un nome file
Tali risultati vengono passati sul |pipe
file a sed
cui corrisponde solo:
- La riga vuota che precede un nome percorso e la riga seguente
- Le righe che iniziano con
-
(in altre parole - non d
per directory) che contengono anche il tuo date
.
- Tuttavia, non stampa le righe del nome percorso, a meno che la directory che nominano non contenga effettivamente i file filtrati.
L'output è simile al seguente:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
Sì, funziona anche con LS_COLORS
- che è probabilmente una priorità bassa per il tuo cron
ovviamente, ma hey le tue opzioni sono aperte.
In ogni caso, ciò offre alcuni vantaggi significativi rispetto ad altre possibili soluzioni.
In primo luogo find
+ ls
coinvolge più invocazioni - questo implica solo un singolo ls
processo, ed è per questo che è in grado di ordinare in modo affidabile tutto - cosa che fa di default - e quindi sort
è anche reso accessorio.
Qualsiasi soluzione che coinvolge find
ed sort
e ls
praticamente fa tutto il lavoro due volte. ls
e find
risolverà ogni percorso e stat
ogni file. ls
e sort
ordinerà entrambi tutti i risultati. Probabilmente è meglio invece usare solo il singolo ls
.
Quindi ovviamente c'è la date
e sed
parti di questa risposta. La cosa importante da notare al riguardo è che fai la parte difficile e ottieni prima la regex - e solo una volta - e in seguito poti solo un singolo elenco di risultati piuttosto che dire, ottenere risultati, ottenere risultati, ordinare risultati e ordinare risultati.
Ciò non si interrompe sui nomi di file contenenti newline, come probabilmente lo faranno altre soluzioni. Questa soluzione ha i suoi avvertimenti - che spiego in seguito - ma sono piccoli e facili da gestire. Secondo me, questa è la soluzione più solida qui.
Esistono due casi in cui il comando sopra potrebbe causare problemi. Il primo riguarda i ?
globs nei nomi dei file - mentre com'è è già una soluzione più solida di qualsiasi altra offerta qui, e la probabilità che incontrerai un ?
a è abbastanza piccola da sola, c'è una possibilità che risolverli potrebbe corrispondere a più di un nome file. Si prega di consultare questo per ulteriori informazioni su questo argomento.
L'altra possibilità comporta un falso positivo, ad esempio se hai un nome file che corrisponde effettivamente alla date
stringa per la quale stiamo cercando grep
ma che non è stato effettivamente modificato in nessuno di quei giorni. Non sto contando sul fatto che si tratti di un problema, ma, se lo è, chiedilo e probabilmente posso aiutarti a rendere il regex più specifico al fine di gestirlo.
ls -ls **/*(.)