Tengo un archivo con YYYYMMDD
el nombre del archivo, como
file-name-20151002.txt
Quiero determinar si este archivo se modificó después del 02/10/2015.
Notas:
- Puedo hacer esto mirando la salida de
ls
, pero sé que analizar la salida dels
es una mala idea. - No necesito encontrar todos los archivos con fecha posterior a una fecha específica, solo necesito probar un archivo específico a la vez.
- No me preocupa que el archivo se modifique en la misma fecha después de haberlo creado. Es decir, solo quiero saber si este archivo con
20151002
el nombre se modificó el 03 de octubre de 2015 o posterior. - Estoy en MacOs 10.9.5.
bash
files
osx
timestamps
Peter Grill
fuente
fuente
Respuestas:
Aquí hay algunas formas posibles con:
OSX stat
:GNU date
:zsh
solamente:Uso:
Salida de ejemplo:
o
fuente
El siguiente script verificará las fechas de todos los archivos especificados en la línea de comando:
Se requiere versiones GNU de
sed
,date
ystat
Aquí hay una versión que no se ha probado pero que debería funcionar en Mac (y en FreeBSD, etc.) si he leído las páginas de manual en línea correctamente:
fuente
sed: illegal option -- r
con MacOS 10.9.5.-r
es unased
opción de GNU para decirle que use expresiones regulares extendidas. Puede cambiar el script sed para usar regexp básico en lugar de extendido (p. Ej.,sed -e 's/^.*\(2015\)/\1/')
Pero el resto del script probablemente todavía fallará porque requiere las versiones GNU dedate
ystat
, y no creo que las Mac vengan con ellos de forma estándar (aunque son disponible para Mac en paquetes precompilados)El uso de bash y
stat
yexpr
para obtener las fechas como números y compararlos:Esta fue mi respuesta anterior específica de Linux.
El
=~
operador bash regexp captura los 8 dígitos del nombre del archivo en la matriz bash BASH_REMATCH.[[ ]]
compara las cadenas, aunque simplemente las compara como números en su lugar[ -gt ]
.fuente
-c
opción de hacerlostat
.stat -f %m -t %F "$file"
. Lo siento, no puedo probarlo.stat
según su comentario, las cosas parecen ejecutarse pero no hay salida para todos los casos de prueba. Pero, ¿qué está"$file" =~ ([0-9]{8}).txt$
haciendo?.txt
al final del nombre del archivo. El paréntesis()
captura la parte de 8 dígitos, y puede encontrarlo en${BASH_REMATCH[1]}
.if [[=~]]
, puede probar el básicoif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
y luego reemplazarlo${BASH_REMATCH[1]}
por$filedate
.Podrías hacer esto:
touch
comando (agregando 0s por hora / minuto / segundo) para establecer la fecha de modificación para el archivo temporalDebido a que su pregunta es sobre
bash
, es probable que esté utilizando Linux. Eltest
programa utilizado en Linux (parte de coreutils ) tiene extensiones para la comparación de marcas de tiempo (-nt
y-ot
) que no se encuentran en POSIXtest
.POSIX comenta sobre esto en la justificación de
test
:Usando esa extensión, podrías
-nt
operadortest
para hacer la comparación que solicitó.Aquí hay un ejemplo. Una aclaración de OP mencionó la plataforma, por lo que uno podría usar
stat
como alternativa a los archivos temporales (compare OSX y Linux ):fuente
trap
comando.Otro
zsh
enfoque:Informaría los archivos que tienen algo que parece una marca de tiempo en su nombre pero que no corresponde a su última hora de modificación.
zsh
tiene una gran cantidad de operadores como ese para manipular globos y variables. Es muy útil hacer cualquier trabajo rápidamente (y generalmente de manera confiable), pero es bastante difícil entenderlos a todos y a menudo produce lo que generalmente llamamos código de solo escritura (eufemismo para código ilegible, aunque también implica que no lo haga) No es necesario leerlo mientras lo escribe para un solo uso en el símbolo del sistema)Un recorrido rápido por:
**/pattern(qualifier)
: glob recursivo con calificador glob.[0-9](#c8)
coincide con 8 dígitos. Ese es el equivalente de zsh extendedglob deksh
's{8}([0-9])
.D
: incluye archivos ocultose@...@
: el calificador eval glob para ejecutar algún texto para calificar aún más los archivos. Ruta de archivo pasada$REPLY
zstat...
recupere el mtime formateado como AAAAMMDD en la$m
matriz.${REPLY:t}
: se expande a la cola t (el nombre base) del archivo.${(SM)something#pattern}
. Extraiga el patrón de coincidencia de parte de algo . EsosS
( búsqueda de S ubstring) yM
(expandir a la porción M atched) se denominan banderas de expansión de parámetros .fuente