enumere todos los archivos más nuevos que la marca de tiempo dada y ordénelos


8

Quiero enumerar todos los archivos (ordenados por fecha) que son más nuevos que la marca de tiempo en formato 20130207003851en el directorio / tmp solamente. Los subdirectorios pueden omitirse.

Uso de SUSE Linux Enterprise Server 11.

El formato de salida debe ser

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 feb 2013" -ls enumera los archivos que quiero pero

  • ¿Cómo puedo usar la marca de tiempo en un formato 20130207003851
  • ¿Cómo puedo ordenar la salida?
  • ¿Cómo puedo mostrar solo el nombre y la fecha del archivo? Nombre de archivo primero y luego la fecha?

ps No quiero usar el toque para crear un archivo de referencia para encontrar

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time

¿Qué se 2013007000385supone que representa? Supongo que 2013 es el año, pero ¿cómo se llega 007000385al 7 de febrero?
Gilles 'SO- deja de ser malvado'

@Gilles: se supone que es 20130207003851. No lo copié correctamente o ... perdón por eso.
Radek

Respuestas:


10

findadmite muchos formatos de entrada de fecha . El formato más simple para obtener es AAAAMMDD HH: MM: SS. Ya tiene los dígitos en el orden correcto, todo lo que tiene que hacer es extraer el primer grupo ( ${timestamp%??????}: tome todos menos los últimos 6 caracteres;: ${timestamp#????????}tome todos menos los primeros 8 caracteres), y continúe, agregando puntuación y luego el siguiente grupo a medida que avanza.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

En bash (y ksh y zsh), pero no en ash, puede usar la ${STRING_VARIABLE:OFFSET:LENGTH}construcción más legible .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Para ordenar los archivos por fecha, imprima los nombres de archivo precedidos por las fechas y ordénelo, luego elimine el prefijo de la fecha. Use -printfpara controlar el formato de salida. imprime una parte del tiempo de modificación determinado por ; si es así , obtiene el número de segundos desde la época de Unix. A continuación imprimo tres columnas separadas por tabuladores: la hora en formato ordenable, el nombre del archivo y la hora en formato legible por humanos; elimina la primera columna y la llamada para reemplazar la pestaña por suficientes espacios para acomodar todos los nombres de archivo esperados (ajuste 40 como desee). Este código supone que no tiene líneas nuevas o pestañas en los nombres de archivo.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40

solo la parte de buscar find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'me da una salida divertida-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek

@Radek Lo siento, es %Tpor el momento, %Mson los permisos.
Gilles 'SO- deja de ser malvado'

Hermoso. Funciona sin problemas. Mi código final es find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-que separé el nombre y la hora del archivo -porque capturaré la salida en php y la usaré como separador. Muchas gracias.
Radek

@Gilles es increíble, pero si explicas la cadena de tiempo, ayudará más ...
Rahul Patil

@RahulPatil Hecho. También agregué un método bash más legible.
Gilles 'SO- deja de ser malvado'

5

Con zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

Las newerfunciones devuelve true de archivos más recientes que $timestamp(nota que zsh's zstatno es compatible con una precisión por debajo del segundo, aunque).

Luego, todo lo que hacemos es usar zshcalificadores globales: Dpara incluir archivos de puntos, .para considerar solo archivos regulares, Ompara ordenar el tiempo de modificación y +newerpara llamar a la newerfunción para determinar qué archivo seleccionar.

Si desea mostrar también las marcas de tiempo del archivo, puede cambiar newera:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Sin embargo, tenga en cuenta que el resultado de la generación del nombre de archivo incluirá las marcas de tiempo, lo que significa que ya no puede usarlas como nombres de archivo.


esto no funcionará ssh, por ejemplo.
evandrix
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.