POSIX tiene esto que decir sobre las fechas en un ls
-l
listado único:
El <date and time>
campo deberá contener la fecha y la hora apropiadas de cuándo se modificó el archivo por última vez. En el entorno local POSIX, el campo será el equivalente de la salida del siguiente comando de fecha:
date "+%b %e %H:%M"
... si el archivo ha sido modificado en los últimos seis meses, o:
date "+%b %e %Y"
Teniendo esto en cuenta, y asegurándose de que si hay líneas nuevas en un nombre de archivo que estén correctamente bloqueadas con la ls -q
opción también especificada POSIX , es relativamente fácil preparar una expresión regular para un ls
resultado sin find
nada:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
para eso y solo devolverá líneas que contienen las cadenas que representan las fechas de hoy o de ayer. El siguiente comando se suma a eso un poco:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
las opciones consisten en:
-a
devolver todos los archivos en un directorio, incluidos los que comienzan con un .dot
-l
listado largo
-R
enumerar recursivamente todos los directorios secundarios
-c
mostrar el tiempo de modificación en lugar del tiempo de acceso
-q
devolver el globo de shell en ?
lugar de caracteres no imprimibles o \t
ab en un nombre de archivo
Esos resultados se pasan sobre el |pipe
archivo al sed
que solo coincide:
- La línea en blanco que precede a un nombre de ruta y la siguiente línea
- Líneas que comienzan con
-
(en otras palabras, no d
para el directorio) que también contienen su date
.
- Sin embargo, no imprime las líneas del nombre de ruta a menos que el directorio que nombre contenga realmente los archivos por los que ha filtrado.
El resultado se ve así:
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í, incluso funciona LS_COLORS
, lo que probablemente es una prioridad baja para usted, cron
por supuesto, pero, hey, sus opciones están abiertas.
En cualquier caso, esto ofrece algunas ventajas significativas sobre otras posibles soluciones.
En primer lugar, find
+ ls
implica múltiples invocaciones: esto solo implica un único ls
proceso, y es por eso que es capaz de clasificar todo de manera confiable, lo que hace de manera predeterminada, y sort
también se hace auxiliar.
Cualquier solución que involucre find
y sort
ya ls
está haciendo casi todo el trabajo dos veces. ls
y find
ambos resolverán cada ruta y stat
cada archivo. ls
y sort
ambos ordenarán todos los resultados. Probablemente sea mejor usar el sencillo ls
.
Luego, por supuesto, están las partes date
y sed
de esta respuesta. Lo importante a tener en cuenta al respecto es que haces la parte difícil y obtienes la expresión regular primero, y solo una vez, y luego solo podas una lista de resultados en lugar de decir, obtener resultados, obtener resultados, ordenar resultados y ordenar resultados.
Esto no se rompe en los nombres de archivo que contienen nuevas líneas, como probablemente lo harán otras soluciones. Esta solución tiene sus propias advertencias, que explico a continuación, pero son minuciosas y fáciles de manejar. En mi opinión, esta es la solución más sólida aquí.
Hay dos casos en los que el comando anterior puede causarle problemas. El primero involucra los ?
globos en los nombres de archivo, mientras que ya es una solución más sólida que cualquier otra que se ofrezca aquí, y la probabilidad de que encuentres una ?
es bastante pequeña por sí sola, existe la posibilidad de resolver esos globos. podría coincidir con más de un nombre de archivo. Consulte esto para obtener más información sobre este tema.
La otra posibilidad implica un falso positivo, por ejemplo, si tiene un nombre de archivo que realmente coincide con la date
cadena que estamos buscando grep
pero que en realidad no se modificó en ninguno de esos días. No cuento con que eso sea un problema, pero, si lo es, pregunte al respecto y probablemente pueda ayudarlo a hacer que la expresión regular sea más específica para manejar esto.
ls -ls **/*(.)